W3docs

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:

php— editable, runs on the server

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 lang

Listando 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 = en

Como 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());
// 2

Modificando valores de atributos

Para alterar um atributo, atribua um novo valor a ele por meio da sintaxe de array e depois serialize com asXML():

php— editable, runs on the server

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:

php— editable, runs on the server

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 = 5

Resumo

  • 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 e unset() 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.

Prática

Prática
Como você lê todos os atributos de um elemento SimpleXML quando não conhece seus nomes?
Como você lê todos os atributos de um elemento SimpleXML quando não conhece seus nomes?
Was this page helpful?