&reftitle.examples;
Основы работы с модулем SimpleXML
Для работы части примеров руководства к модулю SimpleXML потребуется XML-строка. Вместо повторения строки
в каждом примере, определим строку в файле и подключим файл в примерах. При тестировании методов модуля
подключите этот файл или создайте отдельный XML-документ и считайте строку в формате XML
функцией simplexml_load_file.
Файл examples/simplexml-data.php с XML-строкой для включенияPHP: Устройство парсераMs. CoderOnlivia ActoraMr. CoderEl ActÓr
Так что же, PHP — язык программирования или всё же скриптовый язык?
Истина откроется в этом захватывающем пародийном фильме ужасов
в формате документальной драмы.
Каких только веб-задач не решает PHP!75
XML;
?>
]]>
Простота работы с модулем SimpleXML проявляется
при извлечении строки или числа из базового XML-документа.
Чтение сюжета из элемента <plot>
movie[0]->plot;
?>
]]>
&example.outputs;
Для доступа к элементам XML-документа, названия которых содержат
недопустимые, с точки зрения PHP-соглашения об именовании, символы наподобие дефиса,
название элемента заключают в фигурные скобки и апострофы.
Доступ к строке элемента <line>
movie->{'great-lines'}->line;
?>
]]>
&example.outputs;
Доступ к неуникальным элементам средствами модуля SimpleXML
Для перебора множественных одноимённых дочерних элементов
узла применяют
стандартные методы итерации.
каждого узла */
foreach ($movies->movie->characters->character as $character) {
echo $character->name, ' играет ', $character->actor, PHP_EOL;
}
?>
]]>
&example.outputs;
Свойства наподобие $movies->movie, которое содержал предыдущий пример, —
не массивы, а итерируемые
и доступные как массив объекты.
Работа с атрибутами
До сих пор мы получали только названия и значения элементов.
Модуль SimpleXML умеет получать доступ и к атрибутам элементов.
Доступ к атрибутам элемента получают аналогично
доступу к элементам массива.
первого фильма
* и вывод шкалы оценок */
foreach ($movies->movie[0]->rating as $rating) {
switch ((string) $rating['type']) { // Получаем атрибуты элемента по индексу
case 'thumbs':
echo $rating, ' thumbs up';
break;
case 'stars':
echo $rating, ' stars';
break;
}
}
?>
]]>
&example.outputs;
Сравнение элементов и атрибутов с текстом
Для сравнения со строкой или передачи в функцию,
которая требует строку, элементы или атрибуты приводят к строке оператором приведения
(string), иначе PHP обрабатывает
элементы и атрибуты как объекты.
movie->title == 'PHP: Устройство парсера') {
print 'Мой любимый фильм: ';
}
echo "«", htmlentities((string) $movies->movie->title), "»";
?>
]]>
&example.outputs;
Сравнение двух элементов
Два объекта SimpleXMLElement считаются разными,
даже если указывают на один и тот же элемент.
]]>
&example.outputs;
XPath — язык запросов к элементам XML-документа
Модуль SimpleXML включает встроенную поддержку языка XPath.
Поиск всех элементов <character>.
Запись '//' работает как подстановочный знак, или шаблон.
Один слеш опускают, чтобы указать абсолютный путь:
xpath('//character') as $character) {
echo $character->name, ' играет ', $character->actor, PHP_EOL;
}
?>
]]>
&example.outputs;
Установка значений
Каждый элемент в объекте модуля SimpleXML доступен для изменения.
movie[0]->characters->character[0]->name = 'Miss Coder';
echo $movies->asXML();
?>
]]>
&example.outputs;
PHP: Устройство парсераMiss CoderOnlivia ActoraMr. CoderEl ActÓr
Так что же, PHP — язык программирования или всё же скриптовый язык?
Истина откроется в этом захватывающем пародийном фильме ужасов
в формате документальной драмы.
Каких только веб-задач не решает PHP!75
]]>
Добавление элементов и атрибутов
Модуль SimpleXML легко добавляет дочерние элементы и атрибуты.
movie[0]->characters->addChild('character');
$character->addChild('name', 'Mr. Parser');
$character->addChild('actor', 'John Doe');
$rating = $movies->movie[0]->addChild('rating', 'PG');
$rating->addAttribute('type', 'mpaa');
echo $movies->asXML();
?>
]]>
&example.outputs;
PHP: Устройство парсераMs. CoderOnlivia ActoraMr. CoderEl ActÓrMr. ParserJohn Doe
Так что же, PHP — язык программирования или всё же скриптовый язык?
Истина откроется в этом захватывающем пародийном фильме ужасов
в формате документальной драмы.
Каких только веб-задач не решает PHP!75PG
]]>
Взаимодействие с модулем DOM
В PHP предусмотрели механизм преобразования XML-узлов между форматами модулей SimpleXML и DOM.
Пример показывает, как изменить DOM-элемент в SimpleXML.
loadXML('чепуха');
if (!$dom) {
echo 'Ошибка при разборе документа';
exit;
}
$books = simplexml_import_dom($dom);
echo $books->book[0]->title;
?>
]]>
&example.outputs;
Работа с пространствами имёнOnlivia Actora
XML;
$movies = simplexml_load_string($data);
// Пространство имён http://www.w3.org/XML/1998/namespace доступно по префиксу "xml"
echo $movies->movie->attributes("xml", true)["id"] . "\n";
// Атрибуты в пространстве имён доступны через метод attributes()
echo $movies->movie->attributes("a", true)["link"] . "\n";
// Доступ к атрибутам пространства имён возможен по URI-идентификатору, а не только по префиксу
echo $movies->movie->attributes("http://a")["link"] . "\n";
// Дочерние элементы доступны через метод children()
echo $movies->movie->children("http://a")->actor . "\n";
// Вызов метода xpath() с префиксом требует предварительной регистрации этого префикса
$movies->registerXPathNamespace("a", "http://a");
echo count($movies->xpath("//a:actor")) . "\n";
// Даже пространство имён по умолчанию потребуется зарегистрировать
$movies->registerXPathNamespace("default", "http://default");
echo count($movies->xpath("//default:movie")) . "\n";
// Запрос возвращает пустой результат,
// поскольку элемент movie принадлежит пространству имён, которое не указали в запросе
echo count($movies->xpath("//movie")) . "\n";
?>
]]>
Обработка ошибок в XML-документах
Ошибки при загрузке XML-документов обрабатывают функциями
модуля libxml,
которыми возможно подавить все XML-ошибки, а затем обработать каждую ошибку отдельно.
Объект LibXMLError, который возвращает функция
libxml_get_errors, содержит ряд свойств,
в том числе сообщение,
номер строки
и колонку, или позицию, ошибки.
Загрузка XML-строки с неправильным синтаксисом");
if (!$sxe) {
echo "Ошибка загрузки XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
?>
]]>
&example.outputs;
' expected
Opening and ending tag mismatch: xml line 1 and broken
Premature end of data in tag broken line 1
]]>
&reftitle.seealso;
libxml_use_internal_errorslibxml_get_errorsКласс