attributes()
Aprenda a ler, iterar, modificar, adicionar e remover atributos XML com PHP SimpleXML — incluindo o método attributes() e atributos com namespace.
Introdução
Em XML, um atributo é um par nome/valor anexado à tag de abertura de um elemento, como o isbn em <book isbn="123456789">. O PHP SimpleXML expõe esses atributos por meio de uma API pequena semelhante a um array, para que você possa ler, alterar, adicionar e remover atributos sem precisar analisar o XML manualmente.
Esta página aborda quatro tarefas cotidianas — ler um único atributo, iterar sobre todos eles com attributes(), modificar valores e adicionar novos atributos — além de dois pontos que costumam gerar confusão: conversão de tipo e atributos com namespace.
Lendo um único atributo
Trate o elemento como um array e acesse-o pelo nome do atributo:
Há um problema comum: $xml['isbn'] não é uma string simples — é um SimpleXMLElement. Ele imprime corretamente porque é convertido automaticamente, mas se você o comparar de forma estrita (===) ou armazená-lo para uso posterior, faça a conversão antes:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789"></book>');
$isbn = (string) $xml['isbn']; // cast to a real string
var_dump($isbn === '123456789');
// bool(true)Use isset() para verificar se um atributo existe antes de lê-lo:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789"></book>');
echo isset($xml['isbn']) ? "has isbn\n" : "no isbn\n";
echo isset($xml['lang']) ? "has lang\n" : "no lang\n";
// has isbn
// no langListando todos os atributos com attributes()
Quando você não conhece os nomes dos atributos de antemão, chame o método attributes(). Ele retorna um SimpleXMLElement sobre o qual você pode iterar, com o nome do atributo como chave e seu valor como valor:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"><title>PHP Basics</title></book>');
foreach ($xml->attributes() as $name => $value) {
echo "$name = $value\n";
}
// isbn = 123456789
// lang = enComo o resultado é contável, você também pode obter o número de atributos:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
echo count($xml->attributes());
// 2Modificando valores de atributos
Para alterar um atributo, atribua um novo valor a ele por meio da sintaxe de array e depois serialize com asXML():
Adicionando atributos
Um novo elemento criado com simplexml_load_string() ou new SimpleXMLElement() pode não ter o atributo que você precisa. Adicione um com addAttribute(), passando o nome e o valor:
Observe que atribuir a um atributo que ainda não existe ($xml['isbn'] = '...') também o cria — mas addAttribute() é a única forma de adicionar um atributo com namespace.
Removendo um atributo
Não existe um método dedicado para "remover". Use unset() para remover o atributo:
<?php
$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
unset($xml['lang']);
echo $xml->asXML();
// <?xml version="1.0"?>
// <book isbn="123456789"/>Atributos com namespace
Atributos que pertencem a um namespace XML (por exemplo, meta:rating) ficam ocultos em uma chamada simples a attributes(). Passe o URI do namespace para lê-los:
<?php
$xml = new SimpleXMLElement(
'<book xmlns:meta="http://example.com/meta" meta:rating="5"><title>PHP Basics</title></book>'
);
foreach ($xml->attributes('http://example.com/meta') as $name => $value) {
echo "$name = $value\n";
}
// rating = 5Resumo
- Leia um único atributo com a sintaxe de array:
$xml['isbn']. Converta para(string)em comparações estritas. - Itere sobre todos os atributos com
attributes(); o resultado é iterável e contável. - Atribua um novo valor para modificar, use
addAttribute()para adicionar eunset()para remover. - Passe um URI de namespace para
attributes()para acessar atributos com namespace.
Para aprofundar, consulte visão geral do SimpleXML, simplexml_load_string() e análise de XML com SimpleXML.