Files
php-doc-ru/reference/simplexml/examples.xml
Mikhail Alferov 8ea9394e5d Обновление перевода (#887)
Co-authored-by: Sergey Panteleev <sergey@php.net>
2024-02-12 16:32:19 +03:00

514 lines
15 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: a0ae28d3bc85f927c22649ebd9a590b921534b7d 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>
Часть примеров этого руководства включает XML-строку. Чтобы
не повторять строку в каждом примере, её помещают в файл,
который и включают в каждый пример. Строка приведена в следующем
примере. Кроме этого можно создать XML-документ и считывать его
функцией <function>simplexml_load_file</function>.
</para>
<para>
<example>
<title>Файл example.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>
Таким образом, это язык. Это всё равно язык программирования. Или
это скриптовый язык? Обо всём рассказывает этот документальный фильм,
похожий на фильм ужасов.
</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 'example.php';
$movies = new SimpleXMLElement($xmlstr);
echo $movies->movie[0]->plot;
?>
]]>
</programlisting>
&example.outputs;
<screen>
<![CDATA[
Таким образом, это язык. Это всё равно язык программирования. Или
это скриптовый язык? Обо всём рассказывает этот документальный фильм,
похожий на фильм ужасов.
]]>
</screen>
</example>
</para>
<para>
В PHP получить доступ к элементу в XML-документе, который содержит
в названии недопустимые символы (например, дефис), можно путём
заключения имени элемента в фигурные скобки и апострофы.
<example>
<title>Получение строки <literal>&lt;line&gt;</literal></title>
<programlisting role="php">
<![CDATA[
<?php
include 'example.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 'example.php';
$movies = new SimpleXMLElement($xmlstr);
/* Для каждого узла <character>, мы отдельно выведем имя <name>. */
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 также умеет получать доступ к атрибутам элемента.
Получить доступ к атрибуту элемента можно так же, как
к элементам массива (<type>array</type>).
</simpara>
<programlisting role="php">
<![CDATA[
<?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;
}
}
?>
]]>
</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 'example.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>
Два элемента SimpleXMLElements признаются разными, даже если
они указывают на один и тот же объект.
</simpara>
<programlisting role="php">
<![CDATA[
<?php
include 'example.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>
<programlisting role="php">
<![CDATA[
<?php
include 'example.php';
$movies = new SimpleXMLElement($xmlstr);
foreach ($movies->xpath('//character') as $character) {
echo $character->name, ' играет ', $character->actor, PHP_EOL;
}
?>
]]>
</programlisting>
<simpara>
Запись «<literal>//</literal>» работает как подстановочный знак, или шаблон.
Чтобы указать абсолютный путь, один слеш опускают.
</simpara>
&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 'example.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>
Таким образом, это язык. Это всё равно язык программирования. Или
это скриптовый язык? Обо всём рассказывает этот документальный фильм,
похожий на фильм ужасов.
</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 '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();
?>
]]>
</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>
Таким образом, это язык. Это всё равно язык программирования. Или
это скриптовый язык? Обо всём рассказывает этот документальный фильм,
похожий на фильм ужасов.
</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>
</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
-->