mirror of
https://github.com/php/doc-ru.git
synced 2026-03-24 15:52:13 +01:00
564 lines
17 KiB
XML
564 lines
17 KiB
XML
<?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Ó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><plot></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><line></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><character></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Ó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Ó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
|
||
-->
|