Manipulando XML com o XPATH do SIMPLE_XML no PHP

php-xml O SimpleXML costuma ser lembrado apenas pela API simples, mas o suporte a XPath abre portas para filtros complexos em poucos comandos.

1. Carregando o documento

$xml = simplexml_load_file(__DIR__.'/pedidos.xml');

Outra opção é simplexml_load_string caso o conteúdo venha de uma API.

2. Selecionando nós com XPath

$pendentes = $xml->xpath('//pedido[@status="pendente"]');

O retorno é um array de SimpleXMLElement. Podemos encadear consultas:

foreach ($pendentes as $pedido) {
    $itens = $pedido->xpath('itens/item[@quantidade>1]');
    // ...
}

3. Namespaces

Quando o documento possui namespaces, registre-os antes da consulta:

$xml->registerXPathNamespace('g', 'http://base.google.com/ns/1.0');
$produtos = $xml->xpath('//g:price');

4. Convertendo para arrays

function xmlToArray(SimpleXMLElement $element): array
{
    return json_decode(json_encode($element), true);
}

Isso facilita o uso com collections do Laravel ou validações customizadas.

5. Atualizando valores

Embora o SimpleXML seja orientado a leitura, dá para alterar nós simples:

$pedido = $xml->xpath('//pedido[@id="42"]')[0] ?? null;
if ($pedido) {
    $pedido['status'] = 'enviado';
    $xml->asXML(__DIR__.'/pedidos.xml');
}

6. Boas práticas

  • Utilize libxml_use_internal_errors(true) para capturar erros de parsing.
  • Prefira XPath para filtros complexos em vez de múltiplos foreach.
  • Ao manipular arquivos grandes, combine SimpleXML com XMLReader para reduzir o uso de memória.

Com poucos trechos de código conseguimos navegar, transformar e salvar XMLs de integrações legadas sem recorrer a bibliotecas externas.

← Voltar para Blog — Artigos sobre PHP, JavaScript e DevOps