- PHP SimpleXML Parser
- The SimpleXML Parser
- Installation
- PHP SimpleXML — Read From String
- Example
- Example
- PHP SimpleXML — Read From File
- Example
- More PHP SimpleXML
- SimpleXML. Начало работы
- Загрузка XML
- Получение данных
- Атрибуты
- Получение дочерних узлов
- Получение атрибутов
- Изменение значений узлов и атрибутов
- Добавление элементов и атрибутов
- Использование XPath
- Взаимодействие с DOM
- simplexml_load_file
- Список параметров
- Возвращаемые значения
- Ошибки
- Примеры
- Смотрите также
PHP SimpleXML Parser
SimpleXML is a PHP extension that allows us to easily manipulate and get XML data.
The SimpleXML Parser
SimpleXML is a tree-based parser.
SimpleXML provides an easy way of getting an element’s name, attributes and textual content if you know the XML document’s structure or layout.
SimpleXML turns an XML document into a data structure you can iterate through like a collection of arrays and objects.
Compared to DOM or the Expat parser, SimpleXML takes a fewer lines of code to read text data from an element.
Installation
From PHP 5, the SimpleXML functions are part of the PHP core. No installation is required to use these functions.
PHP SimpleXML — Read From String
The PHP simplexml_load_string() function is used to read XML data from a string.
Assume we have a variable that contains XML data, like this:
The example below shows how to use the simplexml_load_string() function to read XML data from a string:
Example
$xml=simplexml_load_string($myXMLData) or die(«Error: Cannot create object»);
print_r($xml);
?>
The output of the code above will be:
SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don’t forget me this weekend! )
Error Handling Tip: Use the libxml functionality to retrieve all XML errors when loading the document and then iterate over the errors. The following example tries to load a broken XML string:
Example
$xml = simplexml_load_string($myXMLData);
if ($xml === false) echo «Failed loading XML: «;
foreach(libxml_get_errors() as $error) echo «
«, $error->message;
>
> else print_r($xml);
>
?>
The output of the code above will be:
Failed loading XML:
Opening and ending tag mismatch: user line 3 and wronguser
Opening and ending tag mismatch: email line 4 and wrongemail
PHP SimpleXML — Read From File
The PHP simplexml_load_file() function is used to read XML data from a file.
Assume we have an XML file called «note.xml», that looks like this:
The example below shows how to use the simplexml_load_file() function to read XML data from a file:
Example
The output of the code above will be:
SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don’t forget me this weekend! )
Tip: The next chapter shows how to get/retrieve node values from an XML file with SimpleXML!
More PHP SimpleXML
For more information about the PHP SimpleXML functions, visit our PHP SimpleXML Reference.
SimpleXML. Начало работы
Расширение SimpleXML предоставляет очень простой и легкий в использовании набор инструментов для преобразования XML в объект, с которым можно затем работать через его свойства и с помощью итераторов. SimpleXML присутствует в PHP начиная с версии 5.
Для наглядности, в качестве примера будем использовать XML, описывающий простой кулинарный рецепт, взятый с википедии.
Мука Дрожжи Тёплая вода Соль Смешать все ингредиенты и тщательно замесить. Закрыть тканью и оставить на один час в тёплом помещении. Замесить ещё раз, положить на противень и поставить в духовку.
Загрузка XML
Прежде чем начать обрабатывать данные, их нужно сначала загрузить. Для этого достаточно использовать функцию simplexml_load_file(). Она принимает имя файла, и возвращает объект типа SimpleXMLElement. И с этим объектом уже можно будет работать.
$xml = simplexml_load_file('recipe.xml'); print_r($xml);
SimpleXMLElement Object ( [@attributes] => Array ( [name] => хлеб [preptime] => 5 [cooktime] => 180 ) [title] => Простой хлеб [ingredient] => Array ( [0] => Мука [1] => Дрожжи [2] => Тёплая вода [3] => Соль ) [instructions] => SimpleXMLElement Object ( [step] => Array ( [0] => Смешать все ингредиенты и тщательно замесить. [1] => Закрыть тканью и оставить на один час в тёплом помещении. [2] => Замесить ещё раз, положить на противень и поставить в духовку. ) ) )
Кроме того, существует еще и функция simplexml_load_string(), которая берет XML не из файла, а из строки.
$str = file_get_contents('recipe.xml'); $xml = simplexml_load_string($str);
Получение данных
SimpleXML предоставляет очень удобный способ получения данных из XML. К примеру, для того чтобы получить какой-либо узел документа достаточно просто обратится к этому узлу по имени:
// Выводит содержимое элемента echo $xml->title;
Поскольку ингредиентов у нас несколько, то $xml->ingredient будет массивом из четырех элементов. Перебрать все ингредиенты можно так:
foreach ( $xml->ingredient as $ingredient ) echo $ingredient . '
'; >
Для того что бы получить, к примеру, третий ингредиент (теплая вода), достаточно обратиться к нему по индексу:
$xml->ingredient[2]; // элементы массивы нумеруются с нуля
Шаги приготовления (step) являются дочерними для элемента instructions, чтобы получить их, нужно сначала получить instructions:
echo $xml->instructions->step; // выводит текст первого шага
Атрибуты
Работать с атрибутами тоже очень легко. Они доступны как ассоциативный массив своего элемента. То есть, для того что бы получить название рецепта (атрибут name корневого узла recipe), достаточно написать:
Или, для получения количества первого ингредиента можно написать так:
Сейчас мы рассмотрели только один способ получения данных: когда нам уже известны названия узлов и атрибутов. Но случается и так, когда структура XML файла заранее не известна, но нам нужно его обработать. SimpleXML предоставляет и такую возможность.
Получение дочерних узлов
Метод children() возвращает список дочерних элементов. В нашем случае $xml — корневая ветвь, и если написать:
$nodes = $xml->children(); echo $nodes[0];
то получим содержимое элемента , а если:
$nodes = $xml->children(); echo $nodes[2];
Обойти все дочерние ветви первого уровня легко можно при помощи цикла foreach:
Простой хлеб Мука Дрожжи Тёплая вода Соль
Фукция count() позволяет определить количество дочерних узлов.
Для того, чтобы получить имя текущий ветви, используется метод getName():
$nodes = $xml->children(); echo $nodes[0]->getName(); // выведет title
Получение атрибутов
Получить список атрибутов для текущего элемента поможет метод attributes(). По функционалу и механизму работы он аналогичен методу children(), за тем исключением, что здесь идет работа с атрибутами.
$nodes = $xml->children(); // все атрибуты узлаМука foreach ( $nodes[1]->attributes() as $name => $value ) echo 'атрибут ' . $name . ', значение ' . $value . '
'; >
атрибут amount, значение 3
атрибут unit, значение стакан
Изменение значений узлов и атрибутов
Объект SimpleXMLElement позволяет манипулировать всеми элементами:
$xml = simplexml_load_file('recipe.xml'); $xml->title = 'Ржаной хлеб'; $xml->ingredient[0] = 'Ржаная мука'; print_r($xml); $xml->ingredient[2]['amount'] = '300'; $xml->ingredient[2]['unit'] = 'грамм'; print_r($xml->ingredient[2]);
SimpleXMLElement Object ( [@attributes] => Array ( [name] => хлеб [preptime] => 5 [cooktime] => 180 ) [title] => Ржаной хлеб [ingredient] => Array ( [0] => Ржаная мука [1] => Дрожжи [2] => Тёплая вода [3] => Соль ) [instructions] => SimpleXMLElement Object ( [step] => Array ( [0] => Смешать все ингредиенты и тщательно замесить. [1] => Закрыть тканью и оставить на один час в тёплом помещении. [2] => Замесить ещё раз, положить на противень и поставить в духовку. ) ) )
SimpleXMLElement Object ( [@attributes] => Array ( [amount] => 300 [unit] => грамм ) [0] => Тёплая вода )
Добавление элементов и атрибутов
Чтобы добавить дочерний элемент к текущему, достаточно использовать метод addChild(). Первым параметром идет имя нового элемента, вторым значение, которое задавать необязательно.
Добавим еще один шаг к инструкциям:
$node = $xml->instructions; // получаем ветвь инструкций $node->addChild('step', 'Почитать газету'); // добавляем элемент print_r($node);
SimpleXMLElement Object ( [step] => Array ( [0] => Смешать все ингредиенты и тщательно замесить. [1] => Закрыть тканью и оставить на один час в тёплом помещении. [2] => Замесить ещё раз, положить на противень и поставить в духовку. [3] => Почитать газету ) )
Метод addAttribute() позволяет добавить атрибут к текущему узлу. Первый параметр это имя атрибута, второй значение.
$node = $xml->instructions; // получаем ветвь инструкций $step = $node->addChild('step', 'Почитать газету'); // добавляем элемент $step->addAttribute('newspaper', 'Аргументы и факты'); // добавляем артибут print_r($step);
SimpleXMLElement Object ( [@attributes] => Array ( [newspaper] => Аргументы и факты ) [0] => Почитать газету )
Использование XPath
SimpleXML включает в себя встроенную поддержку XPath. Поиск всех элементов :
foreach ($xml->xpath('//step') as $step) echo $step . '
'; >
Смешать все ингредиенты и тщательно замесить.
Закрыть тканью и оставить на один час в тёплом помещении.
Замесить ещё раз, положить на противень и поставить в духовку.
Взаимодействие с DOM
PHP может преобразовывать XML узлы из SimpleXML в формат DOM и наоборот. Этот пример показывает, как можно изменить DOM элемент в SimpleXML:
$dom = new DOMDocument('1.0', 'utf-8'); $dom->load('recipe.xml'); $xml = simplexml_import_dom($dom);
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (99)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (146)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (68)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (27)
- Ключ (28)
- Команда (68)
- Компонент (60)
- Конфигурация (62)
- Корзина (32)
- ЛокальнаяСеть (28)
- Модуль (34)
- Навигация (31)
- Настройка (140)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (99)
- Сервер (74)
- Событие (27)
- Теория (105)
- Установка (66)
- Файл (47)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)
simplexml_load_file
Преобразует правильно сформированный XML-документ в указанном файле в объект.
Список параметров
Замечание:
Libxml 2 декодирует URI, так что если вы хотите передать, например, b&c как параметр URI a, вы должны вызвать simplexml_load_file(rawurlencode(‘http://example.com/?a=’ . urlencode(‘b&c’))). Начиная с PHP 5.1.0 этого не требуется, потому, что PHP сделает это за вас.
Вы можете использовать этот необязательный параметр для того, чтобы функция simplexml_load_file() возвращала объект указанного класса. Этот класс должен расширять класс SimpleXMLElement .
Начиная с PHP 5.1.0 и Libxml 2.6.0, вы также можете использовать параметр options чтобы указать дополнительные параметры Libxml.
Префикс пространства имен или URI.
TRUE если ns является префиксом, и FALSE если URI; по умолчанию равен FALSE .
Возвращаемые значения
Возвращает объект ( object ) класса SimpleXMLElement со свойствами, содержащими данные, которые хранятся внутри XML-документа или FALSE в случае возникновения ошибки.
Ошибки
Генерирует сообщение об ошибке уровня E_WARNING для каждой ошибки, найденной в XML-данных.
Используйте функцию libxml_use_internal_errors() для того, чтобы подавить все ошибки XML, и функцию libxml_get_errors() для прохода по ним впоследствии.
Примеры
Пример #1 Интерпретация XML-документа
//Файл test.xml содержит XML-документ с корневым элементом
//и, по крайней мере, элемент /[root]/title.
?php
if ( file_exists ( ‘test.xml’ )) $xml = simplexml_load_file ( ‘test.xml’ );
print_r ( $xml );
> else exit( ‘Не удалось открыть файл test.xml.’ );
>
?>
Этот скрипт выведет, в случае успешного завершения, следующее:
SimpleXMLElement Object ( [title] => Пример заголовка . )
Здесь вы можете использовать $xml->body и любые другие элементы.
Смотрите также
- simplexml_load_string() — Интерпретирует строку с XML в объект
- SimpleXMLElement::__construct() — Создание нового SimpleXMLElement объекта
- Работа с ошибками XML
- libxml_use_internal_errors() — Отключение ошибок libxml и передача полномочий по выборке и обработке информации об ошибках пользователю
- Базовое использование SimpleXML