SimpleXML. Часть 1. Введение в SimpleXML

В данном цикле статей будет рассмотрено SimpleXML – расширение PHP для обработки XML. Для начала разберем основные методы, потом напишем простенький скрипт – построение дерева на основе XML файла.

Для наглядности,  в качестве примера будем использовать XML, описывающий простой кулинарный рецепт, взятый с википедии :)

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <recipe name="хлеб" preptime="5" cooktime="180">
  3.   <title>Простой хлеб</title>
  4.   <ingredient amount="3" unit="стакан">Мука</ingredient>
  5.   <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient>
  6.   <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient>
  7.   <ingredient amount="1" unit="чайная ложка">Соль</ingredient>
  8.   <instructions>
  9.    <step>Смешать все ингредиенты и тщательно замесить.</step>
  10.    <step>Закрыть тканью и оставить на один час в тёплом помещении.</step>
  11.    <step>Замесить ещё раз, положить на противень и поставить в духовку.</step>
  12.   </instructions>
  13. </recipe>

Загрузка XML

Прежде чем начать обрабатывать данные, их нужно сначала получить :). Для того что бы проанализировать XML документ и сохранить его в переменной достаточно использовать функцию simplexml_load_file(). Она принимает имя файла, и возвращает объект типа SimpleXMLElement (либо наследуемого от него). И с этим объектом уже можно будет работать.

$xml = simplexml_load_file("tmp.xml");

Кроме того, существует еще и функция simplexml_load_string, которая берет XML не из файла, а из строки.

Следует отметить, что получаемый в итоге объект – это и есть корневая ветвь документа...

Получение данных

SimpleXML предоставляет очень удобный способ получения данных из XML. К примеру, для того что бы получить какой-либо узел документа достаточно просто обратится к этому узлу по имени, как к полю класса SimpleXMLElement.

К примеру, что бы получить название рецепта, достаточно написать следующее:

 echo $xml->title

Поскольку ингредиентов у нас несколько, то $xml->ingredient будет массивом из четырех элементов. Перебрать все ингредиенты можно так:

  1. foreach ( $xml->ingredient as $ingredient ) {
  2.     echo $ingredient . "<br />";
  3. }

Для того что бы получить, к примеру, третий ингредиент, достаточно обратиться к нему по индексу:  $xml->ingredient[2] (так, как элементы массивы нумеруются с 0).

Шаги приготовления (step) являются дочерними для ветки instructions, и что бы получить их, нужно сначала получить instructions:

 echo $xml->instructions->step // Выведет текст первого шага

Атрибуты

Работать с атрибутами тоже очень легко. Они доступны как ассоциативный массив своего элемента.

То есть для того что бы получить название рецепта (атрибут name, корневого узла recipe), достаточно написать:

 echo $xml['name'];

Или, для получения количества первого ингредиента можно написать так:

echo $xml->ingredient['amount'];

Сейчас мы рассмотрели только один способ получения данных: когда нам уже известные название узлов и атрибутов. Но случается и так, когда структура XML файла заранее не известна, но нам нужно его обработать. SimpleXML тоже предоставляет такую возможность.

Получение дочерних узлов

Метод children() – возвращает список дочерних элементов. То есть, в нашем случае, $xml – корневая ветвь, и если написать:

  1. $nodes = $xml->children();
  2. echo $nodes[0];

То получим элемент title, а если:

  1. $nodes = $xml->children();
  2. echo $nodes[2];

То второй ингредиент.

Обойти все дочерние ветви первого уровня легко можно при помощи цикла foreach.

  1. foreach ( $xml->children() as $node ) {
  2.     echo $node;
  3. }

Определить количество дочерних узлов можно фукцией count().

Для того что бы получить имя текущий ветви используется метод getName()

  1. $nodes = $xml->children();
  2. echo $nodes[0]->getName(); // Выведет "title"

Получение атрибутов

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

Добавление элемента

Что бы добавить дочерний элемент к текущему, достаточно использовать метод addChild.

Первым параметром идет имя нового элемента, вторым значение, которое задавать необязательно.

Добавим еще один шаг к инструкциям:

  1. $node = $xml->instructions; // Получаем ветвь инструкций
  2. $node->addChild("step", "Почитать газету"); // Добавляем шаг

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

Метод addAttribute позволяет добавить атрибут к текущему узлу. Первый параметр это имя атрибута, второй значение.

На это первую часть цикла статей можно закончить. Мы разобрали основные методы работы с SimpleXML, правда не касались, такой важной части XML, как пространства имен, но это уже будет рассмотрено позже.

xml, php

Комментарии (0)

Добавить комментарий

  • Допустимые html-теги:
    <b> </b> - жирный шрифт
    <em> </em> - наклонный
    <s> </s> - зачеркнутый
    <pre> </pre> - сохранение отступов (печать кода)
    [?]
Введите текст с картинки