В данной статье будет рассмотрено SimpleXML – расширение PHP для обработки XML.
Для наглядности, в качестве примера будем использовать XML, описывающий простой кулинарный рецепт.
Прежде чем начать обрабатывать данные, их нужно сначала получить. Для того что бы проанализировать XML документ и сохранить его в переменной достаточно использовать функцию simplexml_load_file(). Она принимает имя файла, и возвращает объект типа SimpleXMLElement (либо наследуемого от него). И с этим объектом уже можно будет работать:
Кроме того, существует еще и функция simplexml_load_string, которая берет XML не из файла, а из строки.
Следует отметить, что получаемый в итоге объект – это и есть корневая ветвь документа…
SimpleXML предоставляет очень удобный способ получения данных из XML. К примеру, для того что бы получить какой-либо узел документа достаточно просто обратится к этому узлу по имени, как к полю класса SimpleXMLElement.
К примеру, что бы получить название рецепта, достаточно написать следующее:
Поскольку ингредиентов у нас несколько, то $xml->ingredient будет массивом из четырех элементов. Перебрать все ингредиенты можно так:
Для того что бы получить, к примеру, третий ингредиент, достаточно обратиться к нему по индексу: $xml->ingredient[2].
Шаги приготовления (step) являются дочерними для ветки instructions, и что бы получить их, нужно сначала получить instructions:
Работать с атрибутами тоже очень легко. Они доступны как ассоциативный массив своего элемента.
То есть для того что бы получить название рецепта (атрибут name, корневого узла recipe), достаточно написать:
Или, для получения количества первого ингредиента можно написать так:
Сейчас мы рассмотрели только один способ получения данных: когда нам уже известны названия узлов и атрибутов. Но может случится и так, что структура XML файла заранее не известна, но необходимо его обработать. SimpleXML тоже предоставляет такую возможность.
Метод children() – возвращает список дочерних элементов. То есть, в нашем случае, $xml – корневая ветвь, и если написать:
То получим элемент title, а если:
То второй ингредиент.
Обойти все дочерние ветви первого уровня легко можно при помощи цикла foreach.
Определить количество дочерних узлов можно фукцией count().
Для того что бы получить имя текущий ветви используется метод getName():
Получить список атрибутов для текущего элемента поможет метод attributes(). По функционалу и механизму работы он аналогичен children(), за тем исключением, что здесь идет работа с атрибутами.
Что бы добавить дочерний элемент к текущему, достаточно использовать метод addChild.
Первым параметром идет имя нового элемента, вторым — значение, которое, к слову, задавать необязательно.
Добавим еще один шаг к инструкциям:
Метод addAttribute позволяет добавить атрибут к текущему узлу. Первый параметр это имя атрибута, второй значение.
На этом с введением в SimpleXML можно закончить. Мы разобрали основные методы парсинга, и немного коснулись редактирования структуры XML.
Для наглядности, в качестве примера будем использовать XML, описывающий простой кулинарный рецепт.
<?xml version="1.0" encoding="UTF-8"?> <recipe name="хлеб" preptime="5" cooktime="180"> <title>Простой хлеб</title> <ingredient amount="3" unit="стакан">Мука</ingredient> <ingredient amount="0.25" unit="грамм">Дрожжи</ingredient> <ingredient amount="1.5" unit="стакан">Тёплая вода</ingredient> <ingredient amount="1" unit="чайная ложка">Соль</ingredient> <instructions> <step>Смешать все ингредиенты и тщательно замесить.</step> <step>Закрыть тканью и оставить на один час в тёплом помещении.</step> <step>Замесить ещё раз, положить на противень и поставить в духовку.</step> </instructions> </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 будет массивом из четырех элементов. Перебрать все ингредиенты можно так:
foreach ( $xml->ingredient as $ingredient ) { echo $ingredient . "<br />"; }
Для того что бы получить, к примеру, третий ингредиент, достаточно обратиться к нему по индексу: $xml->ingredient[2].
Шаги приготовления (step) являются дочерними для ветки instructions, и что бы получить их, нужно сначала получить instructions:
echo $xml->instructions->step // Выведет текст первого шага
Атрибуты
Работать с атрибутами тоже очень легко. Они доступны как ассоциативный массив своего элемента.
То есть для того что бы получить название рецепта (атрибут name, корневого узла recipe), достаточно написать:
echo $xml['name'];
Или, для получения количества первого ингредиента можно написать так:
echo $xml->ingredient['amount'];
Сейчас мы рассмотрели только один способ получения данных: когда нам уже известны названия узлов и атрибутов. Но может случится и так, что структура XML файла заранее не известна, но необходимо его обработать. SimpleXML тоже предоставляет такую возможность.
Получение дочерних узлов
Метод children() – возвращает список дочерних элементов. То есть, в нашем случае, $xml – корневая ветвь, и если написать:
$nodes = $xml->children(); echo $nodes[0];
То получим элемент title, а если:
$nodes = $xml->children(); echo $nodes[2];
То второй ингредиент.
Обойти все дочерние ветви первого уровня легко можно при помощи цикла foreach.
foreach ( $xml->children() as $node ) { echo $node; }
Определить количество дочерних узлов можно фукцией count().
Для того что бы получить имя текущий ветви используется метод getName():
$nodes = $xml->children(); echo $nodes[0]->getName(); // Выведет "title"
Получение атрибутов
Получить список атрибутов для текущего элемента поможет метод attributes(). По функционалу и механизму работы он аналогичен children(), за тем исключением, что здесь идет работа с атрибутами.
Добавление элемента
Что бы добавить дочерний элемент к текущему, достаточно использовать метод addChild.
Первым параметром идет имя нового элемента, вторым — значение, которое, к слову, задавать необязательно.
Добавим еще один шаг к инструкциям:
$node = $xml->instructions; // Получаем ветвь инструкций $node->addChild("step", "Почитать газету"); // Добавляем шаг
Добавление атрибута
Метод addAttribute позволяет добавить атрибут к текущему узлу. Первый параметр это имя атрибута, второй значение.
На этом с введением в SimpleXML можно закончить. Мы разобрали основные методы парсинга, и немного коснулись редактирования структуры XML.