1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-26 16:52:12 +01:00
Files
archived-doc-ru/reference/simplexml/examples.xml
2021-04-25 18:41:30 +03:00

498 lines
15 KiB
XML
Raw 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: yes -->
<!-- $Revision$ -->
<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</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 решает все мои задачи в web</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 решает все мои задачи в web</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
-->