Базовое использование 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Ó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 5.2.0.
<?php
include 'example.php';
$movies1 = new SimpleXMLElement($xmlstr);
$movies2 = new SimpleXMLElement($xmlstr);
var_dump($movies1 == $movies2); // false начиная с PHP 5.2.0
?>
Результат выполнения данного примера:
bool(false)
Пример #8 Использование XPath
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Ór</actor> </character> </characters> <plot> Таким образом, это язык. Это все равно язык программирования. Или это скриптовый язык? Все раскрывается в этом документальном фильме, похожем на фильм ужасов. </plot> <great-lines> <line>PHP решает все мои задачи в web</line> </great-lines> <rating type="thumbs">7</rating> <rating type="stars">5</rating> </movie> </movies>
Пример #10 Добавление элементов и атрибутов
Начиная с PHP 5.1.3, 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Ór</actor> </character> <character><name>Mr. Parser</name><actor>John Doe</actor></character></characters> <plot> Таким образом, это язык. Это все равно язык программирования. Или это скриптовый язык? Все раскрывается в этом документальном фильме, похожем на фильм ужасов. </plot> <great-lines> <line>PHP решает все мои задачи в web</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;
?>
Результат выполнения данного примера:
чепуха