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
XMLReaderpara 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.