Базовое использование 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 решает все мои проблемы в web</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 решает все мои проблемы в web 

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

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

<?php
include 'example.php';

$movies = new SimpleXMLElement($xmlstr);

/* Для каждого узла <character>, мы отдельно выведем имя <name>. */
foreach ($movies->movie->characters->character as $character) {
   echo 
$character->name' играет '$character->actorPHP_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->actorPHP_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 решает все мои задачи в 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&#xD3;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;
?>

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

 blah