attributes()
Как читать, перебирать, изменять, добавлять и удалять XML-атрибуты в PHP SimpleXML, включая метод attributes() и атрибуты с пространствами имён.
Введение
В XML атрибут — это пара имя/значение, прикреплённая к открывающему тегу элемента, например isbn в <book isbn="123456789">. PHP SimpleXML открывает доступ к этим атрибутам через небольшой API, похожий на array, — вы можете читать, изменять, добавлять и удалять их без ручного разбора XML.
На этой странице рассмотрены четыре типичных задачи — чтение одного атрибута, перебор всех атрибутов с помощью attributes(), изменение значений и добавление новых атрибутов — а также два распространённых подводных камня: приведение типов и атрибуты с пространствами имён.
Чтение одного атрибута
Обращайтесь к элементу как к array и обращайтесь к нему по имени атрибута:
Здесь есть один распространённый нюанс: $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():
Добавление атрибутов
Новый элемент, созданный через simplexml_load_string() или new SimpleXMLElement(), может не иметь нужного атрибута. Добавьте его с помощью addAttribute(), передав имя и значение:
Обратите внимание: присвоение значения несуществующему атрибуту ($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.