Основы работы с модулем SimpleXML

Часть примеров этого руководства включает XML-строку. Чтобы не повторять строку в каждом примере, её помещают в файл, который и включают в каждый пример. Строка приведена в следующем примере. Кроме этого можно создать XML-документ и считывать его функцией simplexml_load_file().

Пример #1 Файл example.php с XML строкой

<?php
$xmlstr
= <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
<movie>
<title>PHP: Появление Парсера</title>
<characters>
<character>
<name>Ms. Coder</name>
<actor>Onlivia Actora</actor>
</character>
<character>
<name>Mr. Coder</name>
<actor>El Act&#211;r</actor>
</character>
</characters>
<plot>
Таким образом, это язык. Это всё равно язык программирования. Или
это скриптовый язык? Обо всём рассказывает этот документальный фильм,
похожий на фильм ужасов.
</plot>
<great-lines>
<line>PHP решает все мои проблемы в вебе</line>
</great-lines>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie>
</movies>
XML;
?>

Пользоваться модулем SimpleXML очень просто! Попробуйте получить какую-нибудь строку или число из базового XML-документа.

Пример #2 Получение части документа <plot>

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

echo
$movies->movie[0]->plot;

?>

Результат выполнения приведённого примера:


   Таким образом, это язык. Это всё равно язык программирования. Или
   это скриптовый язык? Обо всём рассказывает этот документальный фильм,
   похожий на фильм ужасов.

В PHP получить доступ к элементу в XML-документе, который содержит в названии недопустимые символы (например, дефис), можно путём заключения имени элемента в фигурные скобки и апострофы.

Пример #3 Получение строки <line>

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

echo
$movies->movie->{'great-lines'}->line;

?>

Результат выполнения приведённого примера:

PHP решает все мои проблемы в вебе

Пример #4 Доступ к неуникальным элементам в SimpleXML

В том случае, если существует несколько экземпляров дочерних элементов в одном родительском элементе, нужно применять стандартные методы итерации.

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

/* Для каждого узла <character>, мы отдельно выведем имя <name>. */
foreach ($movies->movie->characters->character as $character) {
echo
$character->name, ' играет ', $character->actor, PHP_EOL;
}

?>

Результат выполнения приведённого примера:

Ms. Coder играет Onlivia Actora
Mr. Coder играет El ActÓr

Замечание:

Свойства ($movies->movie в предыдущем примере) — не массивы. Это итерируемый объект в виде массива.

Пример #5 Работа с атрибутами

До сих пор мы только получали названия и значения элементов. SimpleXML также умеет получать доступ к атрибутам элемента. Получить доступ к атрибуту элемента можно так же, как к элементам массива (array).

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

/* Доступ к узлу <rating> первого фильма.
* Так же выведем шкалу оценок. */
foreach ($movies->movie[0]->rating as $rating) {
switch((string)
$rating['type']) { // Получение атрибутов элемента по индексу
case 'thumbs':
echo
$rating, ' thumbs up';
break;
case
'stars':
echo
$rating, ' stars';
break;
}
}

?>

Результат выполнения приведённого примера:

7 thumbs up5 stars

Пример #6 Сравнение элементов и атрибутов с текстом

Для сравнения элемента или атрибута со строкой или для передачи в функцию в качестве текста, необходимо привести его к строке через оператор приведения (string). В противном случае PHP будет рассматривать элемент как объект.

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

if ((string)
$movies->movie->title == 'PHP: Появление Парсера') {
print
'Мой любимый фильм.';
}

echo
htmlentities((string) $movies->movie->title);

?>

Результат выполнения приведённого примера:

Мой любимый фильм.PHP: Появление Парсера

Пример #7 Сравнение двух элементов

Два элемента SimpleXMLElements признаются разными, даже если они указывают на один и тот же объект.

<?php

include 'example.php';

$movies1 = new SimpleXMLElement($xmlstr);
$movies2 = new SimpleXMLElement($xmlstr);
var_dump($movies1 == $movies2); // false

?>

Результат выполнения приведённого примера:

bool(false)

Пример #8 XPath — язык запросов к элементам XML-документа

SimpleXML включает встроенную поддержку языка XPath. Поиск элементов <character>:

<?php

include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

foreach (
$movies->xpath('//character') as $character) {
echo
$character->name, ' играет ', $character->actor, PHP_EOL;
}

?>

Запись «//» работает как подстановочный знак, или шаблон. Чтобы указать абсолютный путь, один слеш опускают.

Результат выполнения приведённого примера:

Ms. Coder играет Onlivia Actora
Mr. Coder играет by El ActÓr

Пример #9 Установка значений

Данные в SimpleXML не обязаны быть неизменяемыми. Объект разрешает манипулировать всеми элементами.

<?php

include 'example.php';
$movies = new SimpleXMLElement($xmlstr);

$movies->movie[0]->characters->character[0]->name = 'Miss Coder';

echo
$movies->asXML();

?>

Результат выполнения приведённого примера:

<?xml version="1.0" standalone="yes"?>
<movies>
 <movie>
  <title>PHP: Появление Парсера</title>
  <characters>
   <character>
    <name>Miss Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  </characters>
  <plot>
   Таким образом, это язык. Это всё равно язык программирования. Или
   это скриптовый язык? Обо всём рассказывает этот документальный фильм,
   похожий на фильм ужасов.
  </plot>
  <great-lines>
   <line>PHP решает все мои задачи в вебе</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>

Пример #10 Добавление элементов и атрибутов

SimpleXML умеет легко добавлять дочерние элементы и атрибуты.

<?php

include 'example.php';
$movies = new SimpleXMLElement($xmlstr);

$character = $movies->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();

?>

Результат выполнения приведённого примера:

<?xml version="1.0" standalone="yes"?>
<movies>
 <movie>
  <title>PHP: Появление Парсера</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#xD3;r</actor>
   </character>
  <character><name>Mr. Parser</name><actor>John Doe</actor></character></characters>
  <plot>
   Таким образом, это язык. Это всё равно язык программирования. Или
   это скриптовый язык? Обо всём рассказывает этот документальный фильм,
   похожий на фильм ужасов.
  </plot>
  <great-lines>
   <line>PHP решает все мои задачи в вебе</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 <rating type="mpaa">PG</rating></movie>
</movies>

Пример #11 Взаимодействие с DOM

PHP умеет преобразовывать XML-узлы из SimpleXML в формат DOM и наоборот. Пример показывает, как можно изменить DOM-элемент в SimpleXML.

<?php

$dom
= new DOMDocument;
$dom->loadXML('<books><book><title>чепуха</title></book></books>');
if (!
$dom) {
echo
'Ошибка при разборе документа';
exit;
}

$books = simplexml_import_dom($dom);

echo
$books->book[0]->title;

?>

Результат выполнения приведённого примера:

чепуха