W3docs

attributes()

Как читать, перебирать, изменять, добавлять и удалять XML-атрибуты в PHP SimpleXML, включая метод attributes() и атрибуты с пространствами имён.

Введение

В XML атрибут — это пара имя/значение, прикреплённая к открывающему тегу элемента, например isbn в <book isbn="123456789">. PHP SimpleXML открывает доступ к этим атрибутам через небольшой API, похожий на array, — вы можете читать, изменять, добавлять и удалять их без ручного разбора XML.

На этой странице рассмотрены четыре типичных задачи — чтение одного атрибута, перебор всех атрибутов с помощью attributes(), изменение значений и добавление новых атрибутов — а также два распространённых подводных камня: приведение типов и атрибуты с пространствами имён.

Чтение одного атрибута

Обращайтесь к элементу как к array и обращайтесь к нему по имени атрибута:

php— editable, runs on the server

Здесь есть один распространённый нюанс: $xml['isbn'] — это не обычная string — это SimpleXMLElement. Он отображается корректно, так как преобразуется на лету, но если вы сравниваете его строго (===) или сохраняете для дальнейшего использования, сначала выполните приведение:

<?php

$xml = new SimpleXMLElement('<book isbn="123456789"></book>');
$isbn = (string) $xml['isbn'];   // cast to a real string
var_dump($isbn === '123456789');
// bool(true)

Используйте isset(), чтобы проверить наличие атрибута перед чтением:

<?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

Получение всех атрибутов с помощью attributes()

Если имена атрибутов заранее неизвестны, вызовите метод attributes(). Он возвращает SimpleXMLElement, по которому можно итерироваться: ключ — имя атрибута, значение — его значение:

<?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

Поскольку результат поддаётся подсчёту, можно получить количество атрибутов:

<?php

$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
echo count($xml->attributes());
// 2

Изменение значений атрибутов

Чтобы изменить атрибут, присвойте ему новое значение через синтаксис array, затем сериализуйте с помощью asXML():

php— editable, runs on the server

Добавление атрибутов

Новый элемент, созданный через simplexml_load_string() или new SimpleXMLElement(), может не иметь нужного атрибута. Добавьте его с помощью addAttribute(), передав имя и значение:

php— editable, runs on the server

Обратите внимание: присвоение значения несуществующему атрибуту ($xml['isbn'] = '...') также создаёт его — однако addAttribute() — единственный способ добавить атрибут с пространством имён.

Удаление атрибута

Специального метода для удаления не существует. Удалите атрибут с помощью unset():

<?php

$xml = new SimpleXMLElement('<book isbn="123456789" lang="en"></book>');
unset($xml['lang']);
echo $xml->asXML();
// <?xml version="1.0"?>
// <book isbn="123456789"/>

Атрибуты с пространствами имён

Атрибуты, принадлежащие пространству имён XML (например, meta:rating), не видны при обычном вызове attributes(). Для их чтения передайте URI пространства имён:

<?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

Резюме

  • Читайте отдельный атрибут через синтаксис array: $xml['isbn']. Приводите к (string) для строгих сравнений.
  • Перебирайте все атрибуты с помощью attributes() — результат поддаётся итерации и подсчёту.
  • Присваивайте новое значение для изменения, используйте addAttribute() для добавления и unset() для удаления.
  • Передавайте URI пространства имён в attributes() для доступа к атрибутам с пространствами имён.

Для углублённого изучения см. обзор SimpleXML, simplexml_load_string() и разбор XML с помощью SimpleXML.

Практика

Практика
Как получить все атрибуты элемента SimpleXML, если их имена заранее неизвестны?
Как получить все атрибуты элемента SimpleXML, если их имена заранее неизвестны?
Was this page helpful?