1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 15:52:13 +01:00
Files
archived-doc-ru/reference/simplexml/examples.xml
2025-10-17 23:48:30 +03:00

564 lines
17 KiB
XML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: bdc3ab31fb7db217fe9418230a11d9d779ee65eb Maintainer: rjhdby Status: ready -->
<!-- Reviewed: no -->
<chapter xml:id="simplexml.examples" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
&reftitle.examples;
<section xml:id="simplexml.examples-basic">
<title>Основы работы с модулем SimpleXML</title>
<para>
Для работы части примеров руководства к модулю SimpleXML потребуется XML-строка. Вместо повторения строки
в каждом примере, определим строку в файле и подключим файл в примерах. При тестировании методов модуля
подключите этот файл или создайте отдельный XML-документ и считайте строку в формате XML
функцией <function>simplexml_load_file</function>.
</para>
<para>
<example>
<title>Файл examples/simplexml-data.php с XML-строкой для включения</title>
<programlisting role="php" xml:id="simplexml.examples.movie">
<![CDATA[
<?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>
Так что же, PHP — язык программирования или всё же скриптовый язык?
Истина откроется в этом захватывающем пародийном фильме ужасов
в формате документальной драмы.
</plot>
<great-lines>
<line>Каких только веб-задач не решает PHP!</line>
</great-lines>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie>
</movies>
XML;
?>
]]>
</programlisting>
</example>
</para>
<para>
Простота работы с модулем SimpleXML проявляется
при извлечении строки или числа из базового XML-документа.
<example>
<title>Чтение сюжета из элемента <literal>&lt;plot&gt;</literal></title>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
echo $movies->movie[0]->plot;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Так что же, PHP — язык программирования или всё же скриптовый язык?
Истина откроется в этом захватывающем пародийном фильме ужасов
в формате документальной драмы.
]]>
</screen>
</example>
</para>
<para>
Для доступа к элементам XML-документа, названия которых содержат
недопустимые, с точки зрения PHP-соглашения об именовании, символы наподобие дефиса,
название элемента заключают в фигурные скобки и апострофы.
<example>
<title>Доступ к строке элемента <literal>&lt;line&gt;</literal></title>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
echo $movies->movie->{'great-lines'}->line;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Каких только веб-задач не решает PHP!
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Доступ к неуникальным элементам средствами модуля SimpleXML</title>
<simpara>
Для перебора множественных одноимённых дочерних элементов
узла применяют
стандартные методы итерации.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
/* Выведем значение элемента <name> каждого узла <character> */
foreach ($movies->movie->characters->character as $character) {
echo $character->name, ' играет ', $character->actor, PHP_EOL;
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Ms. Coder играет Onlivia Actora
Mr. Coder играет El ActÓr
]]>
</screen>
</example>
</para>
<note>
<para>
Свойства наподобие <literal>$movies->movie</literal>, которое содержал предыдущий пример, —
не массивы, а <link linkend="class.iterator">итерируемые</link>
и <link linkend="class.arrayaccess">доступные как массив</link> объекты.
</para>
</note>
<para>
<example>
<title>Работа с атрибутами</title>
<simpara>
До сих пор мы получали только названия и значения элементов.
Модуль SimpleXML умеет получать доступ и к атрибутам элементов.
Доступ к атрибутам элемента получают аналогично
доступу к элементам массива.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.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;
}
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
7 thumbs up5 stars
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Сравнение элементов и атрибутов с текстом</title>
<simpara>
Для сравнения со строкой или передачи в функцию,
которая требует строку, элементы или атрибуты приводят к строке оператором приведения
<literal>(string)</literal>, иначе PHP обрабатывает
элементы и атрибуты как объекты.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
if ((string) $movies->movie->title == 'PHP: Устройство парсера') {
print 'Мой любимый фильм: ';
}
echo "«", htmlentities((string) $movies->movie->title), "»";
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Мой любимый фильм: «PHP: Устройство парсера»
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Сравнение двух элементов</title>
<simpara>
Два объекта SimpleXMLElement считаются разными,
даже если указывают на один и тот же элемент.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies1 = new SimpleXMLElement($xmlstr);
$movies2 = new SimpleXMLElement($xmlstr);
var_dump($movies1 == $movies2); // false
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
bool(false)
]]>
</screen>
</example>
</para>
<para>
<example>
<title>XPath — язык запросов к элементам XML-документа</title>
<simpara>
Модуль SimpleXML включает встроенную поддержку языка <acronym>XPath</acronym>.
Поиск всех элементов <literal>&lt;character&gt;</literal>.
</simpara>
<simpara>
Запись '<literal>//</literal>' работает как подстановочный знак, или шаблон.
Один слеш опускают, чтобы указать абсолютный путь:
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
foreach ($movies->xpath('//character') as $character) {
echo $character->name, ' играет ', $character->actor, PHP_EOL;
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Ms. Coder играет Onlivia Actora
Mr. Coder играет by El ActÓr
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Установка значений</title>
<simpara>
Каждый элемент в объекте модуля SimpleXML доступен для изменения.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.php';
$movies = new SimpleXMLElement($xmlstr);
$movies->movie[0]->characters->character[0]->name = 'Miss Coder';
echo $movies->asXML();
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
<?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>
Так что же, PHP — язык программирования или всё же скриптовый язык?
Истина откроется в этом захватывающем пародийном фильме ужасов
в формате документальной драмы.
</plot>
<great-lines>
<line>Каких только веб-задач не решает PHP!</line>
</great-lines>
<rating type="thumbs">7</rating>
<rating type="stars">5</rating>
</movie>
</movies>
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Добавление элементов и атрибутов</title>
<simpara>
Модуль SimpleXML легко добавляет дочерние элементы и атрибуты.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'examples/simplexml-data.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();
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
<?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>
Так что же, PHP — язык программирования или всё же скриптовый язык?
Истина откроется в этом захватывающем пародийном фильме ужасов
в формате документальной драмы.
</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>
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Взаимодействие с модулем DOM</title>
<simpara>
В PHP предусмотрели механизм преобразования XML-узлов между форматами модулей SimpleXML и DOM.
Пример показывает, как изменить DOM-элемент в SimpleXML.
</simpara>
<programlisting role="php">
<![CDATA[
<?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;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
чепуха
]]>
</screen>
</example>
</para>
<para>
<example>
<title>Работа с пространствами имён</title>
<programlisting role="php">
<![CDATA[
<?php
$data = <<<XML
<movies xmlns="http://default" xmlns:a="http://a">
<movie xml:id="movie1" a:link="IMDB">
<a:actor>Onlivia Actora</a:actor>
</movie>
</movies>
XML;
$movies = simplexml_load_string($data);
// Пространство имён http://www.w3.org/XML/1998/namespace доступно по префиксу "xml"
echo $movies->movie->attributes("xml", true)["id"] . "\n";
// Атрибуты в пространстве имён доступны через метод attributes()
echo $movies->movie->attributes("a", true)["link"] . "\n";
// Доступ к атрибутам пространства имён возможен по URI-идентификатору, а не только по префиксу
echo $movies->movie->attributes("http://a")["link"] . "\n";
// Дочерние элементы доступны через метод children()
echo $movies->movie->children("http://a")->actor . "\n";
// Вызов метода xpath() с префиксом требует предварительной регистрации этого префикса
$movies->registerXPathNamespace("a", "http://a");
echo count($movies->xpath("//a:actor")) . "\n";
// Даже пространство имён по умолчанию потребуется зарегистрировать
$movies->registerXPathNamespace("default", "http://default");
echo count($movies->xpath("//default:movie")) . "\n";
// Запрос возвращает пустой результат,
// поскольку элемент movie принадлежит пространству имён, которое не указали в запросе
echo count($movies->xpath("//movie")) . "\n";
?>
]]>
</programlisting>
</example>
</para>
</section>
<section xml:id="simplexml.examples-errors">
<title>Обработка ошибок в XML-документах</title>
<para>
Ошибки при загрузке XML-документов обрабатывают функциями
модуля <link linkend="book.libxml">libxml</link>,
которыми возможно подавить все XML-ошибки, а затем обработать каждую ошибку отдельно.
</para>
<para>
Объект <classname>LibXMLError</classname>, который возвращает функция
<function>libxml_get_errors</function>, содержит ряд свойств,
в том числе <link linkend="libxmlerror.props.message">сообщение</link>,
<link linkend="libxmlerror.props.line">номер строки</link>
и <link linkend="libxmlerror.props.column">колонку</link>, или позицию, ошибки.
</para>
<para>
<example>
<title>Загрузка XML-строки с неправильным синтаксисом</title>
<programlisting role="php" xml:id="simplexml.examples.error">
<![CDATA[
<?php
libxml_use_internal_errors(true);
$sxe = simplexml_load_string("<?xml version='1.0'><broken><xml></broken>");
if (!$sxe) {
echo "Ошибка загрузки XML\n";
foreach(libxml_get_errors() as $error) {
echo "\t", $error->message;
}
}
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Ошибка загрузки XML
Blank needed here
parsing XML declaration: '?>' expected
Opening and ending tag mismatch: xml line 1 and broken
Premature end of data in tag broken line 1
]]>
</screen>
</example>
</para>
<section role="seealso"><!-- {{{ -->
&reftitle.seealso;
<para>
<simplelist>
<member><function>libxml_use_internal_errors</function></member>
<member><function>libxml_get_errors</function></member>
<member>Класс <xref linkend="class.libxmlerror" /></member>
</simplelist>
</para>
</section>
</section>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->