mirror of
https://github.com/php/doc-ru.git
synced 2025-07-24 09:59:46 +00:00
514 lines
15 KiB
XML
514 lines
15 KiB
XML
<?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Ó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><plot></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><line></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><character></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Ó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Ó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
|
||
-->
|