simplexml_load_string()
SimpleXML — расширение PHP для работы с XML-документами. Функция simplexml_load_string() загружает XML из строки и создаёт объект SimpleXMLElement.
Введение
SimpleXML — это расширение PHP, которое предоставляет простой и удобный API для работы с XML-документами. Функция simplexml_load_string() является одной из многих функций, предоставляемых SimpleXML для работы с XML-документами. Это мощный инструмент, позволяющий загрузить XML-документ из строки и создать объект SimpleXMLElement. В этой статье мы подробно рассмотрим функцию simplexml_load_string() и способы её применения в PHP.
Понимание функции simplexml_load_string()
Функция simplexml_load_string() в PHP загружает XML-документ из строки и создаёт объект SimpleXMLElement. (Примечание: это процедурный подход; объектно-ориентированным эквивалентом является new SimpleXMLElement($string).) Синтаксис использования функции simplexml_load_string() выглядит следующим образом:
Синтаксис
simplexml_load_string ( string $data [, string $class_name = "SimpleXMLElement" [, int $options = 0 [, string $ns = "" [, bool $is_prefix = false ]]]] ) : SimpleXMLElementЗдесь $data — строка, содержащая загружаемый XML-документ. $class_name — необязательный параметр, задающий имя класса для объекта SimpleXMLElement. $options — необязательный параметр, задающий дополнительные параметры загрузки XML-документа. $ns — необязательный параметр, задающий пространство имён для XML-документа. $is_prefix — необязательный параметр, указывающий, является ли пространство имён префиксом.
Пример использования
Рассмотрим пример, демонстрирующий использование функции simplexml_load_string() в PHP:
Пример использования функции simplexml_load_string() в PHP
В приведённом выше примере мы сначала создаём строку, содержащую XML-документ. Затем используем функцию simplexml_load_string(), чтобы загрузить XML-документ из строки и создать объект SimpleXMLElement. С помощью цикла foreach мы перебираем каждый элемент book в XML-документе и выводим название каждой книги.
Если ваш XML-источник — файл или URL, а не строка, используйте вместо этого simplexml_load_file().
Чтение атрибутов
Атрибуты XML доступны через синтаксис массива ($element['attrName']), тогда как дочерние элементы используют синтаксис свойств ($element->child). Это наиболее распространённая ошибка для новичков:
<?php
$xmlString = '<books><book id="1"><title>PHP Basics</title></book></books>';
$xml = simplexml_load_string($xmlString);
foreach ($xml->book as $book) {
echo "ID: " . $book['id'] . " - Title: " . $book->title . "\n";
}Этот код выведет ID: 1 - Title: PHP Basics. Обратите внимание, что значения атрибутов сами являются объектами SimpleXMLElement, поэтому приводите их к (string) или (int), если вам нужен обычный скалярный тип.
Использование параметра options
Третий параметр принимает константы параметров libxml, изменяющие способ разбора документа. Часто используемой является LIBXML_NOCDATA, которая объединяет секции CDATA с обычными текстовыми узлами, позволяя читать их как обычный контент:
<?php
$xmlString = '<note><body><![CDATA[Hello <b>world</b>]]></body></note>';
$xml = simplexml_load_string($xmlString, "SimpleXMLElement", LIBXML_NOCDATA);
echo (string) $xml->body . "\n";Без LIBXML_NOCDATA значение $xml->body будет пустым при обращении к нему как к строке, поскольку содержимое находится в узле CDATA.
Обработка ошибок
По умолчанию simplexml_load_string() выдаёт предупреждения, если XML-документ некорректен. Для graceful-обработки ошибок можно использовать libxml_use_internal_errors():
<?php
$xmlString = '<books><book><title>PHP Basics</title></books>'; // Missing closing </book> tag
libxml_use_internal_errors(true);
$xml = simplexml_load_string($xmlString);
if ($xml === false) {
foreach (libxml_get_errors() as $error) {
echo "Error: ", trim($error->message), "\n";
}
} else {
foreach($xml->book as $book) {
echo $book->title . "\n";
}
}Когда XML-документ некорректен, simplexml_load_string() возвращает false вместо выброса исключения. Вызов libxml_use_internal_errors(true) подавляет стандартные предупреждения и позволяет проверять собранные ошибки с помощью libxml_get_errors(). Всегда проверяйте возвращаемое значение на false перед использованием результата.
Заключение
simplexml_load_string() разбирает XML-строку в объект SimpleXMLElement, предоставляя объектный доступ к дочерним элементам ($xml->child) и доступ через массив к атрибутам ($xml['attr']). Используйте эту функцию, когда XML уже находится в памяти; применяйте simplexml_load_file(), когда XML находится в файле или по URL. Для надёжного кода включайте внутреннюю обработку ошибок libxml и проверяйте возвращаемое значение перед чтением результата. Для более глубокого изучения SimpleXML API смотрите обзор SimpleXML.