1
0
mirror of https://github.com/php/doc-ru.git synced 2026-03-24 07:42:22 +01:00
Files
archived-doc-ru/reference/xml/functions/xml-parse-into-struct.xml

321 lines
9.4 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: b47e4bea197126359815c5e43403c4b77a0aaaa7 Maintainer: tmn Status: ready -->
<!-- Reviewed: no -->
<refentry xml:id="function.xml-parse-into-struct" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>xml_parse_into_struct</refname>
<refpurpose>Разбор XML-данных и помещение в массив</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type class="union"><type>int</type><type>false</type></type><methodname>xml_parse_into_struct</methodname>
<methodparam><type>XMLParser</type><parameter>parser</parameter></methodparam>
<methodparam><type>string</type><parameter>data</parameter></methodparam>
<methodparam><type>array</type><parameter role="reference">values</parameter></methodparam>
<methodparam choice="opt"><type>array</type><parameter role="reference">index</parameter><initializer>&null;</initializer></methodparam>
</methodsynopsis>
<para>
Эта функция разбирает XML-строку и помещает данные в 2 массива. Массив
<parameter>index</parameter> содержит указатели на размещение значений в
массиве <parameter>values</parameter>. Аргументы, задающие массивы, должны
передаваться в функцию по ссылке.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>parser</parameter></term>
<listitem>
<para>
Ссылка на используемый XML-анализатор.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>data</parameter></term>
<listitem>
<para>
Строка XML-данных.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>values</parameter></term>
<listitem>
<para>
Массив значений XML-данных.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>index</parameter></term>
<listitem>
<para>
Массив указателей на соответствующие значения в массиве $values.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
<function>xml_parse_into_struct</function> возвращает 0 при неудачном
разборе строки и 1 при успешном. Это не то же самое, что &false; и &true;,
будьте осторожны с такими операторами, как ===.
</para>
</refsect1>
<refsect1 role="changelog">
&reftitle.changelog;
<informaltable>
<tgroup cols="2">
<thead>
<row>
<entry>&Version;</entry>
<entry>&Description;</entry>
</row>
</thead>
<tbody>
&xml.changelog.parser-param;
</tbody>
</tgroup>
</informaltable>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
Ниже представлен пример, демонстрирующий внутреннее устройство массивов,
генерируемых функцией. XML-строка содержит простой тег
<literal>note</literal> вложенный в тег <literal>para</literal>.
Программа в примере разбирает эту строку и выводит созданные массивы:
<example>
<title>Пример использования <function>xml_parse_into_struct</function></title>
<programlisting role="php">
<![CDATA[
<?php
$simple = "<para><note>простое примечание</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
echo "Массив index\n";
print_r($index);
echo "\nМассив vals\n";
print_r($vals);
?>
]]>
</programlisting>
<para>
После обработки программа выведет следующее:
</para>
<screen>
<![CDATA[
Index array
Array
(
[PARA] => Array
(
[0] => 0
[1] => 2
)
[NOTE] => Array
(
[0] => 1
)
)
Массив Vals
Array
(
[0] => Array
(
[tag] => PARA
[type] => open
[level] => 1
)
[1] => Array
(
[tag] => NOTE
[type] => complete
[level] => 2
[value] => простое примечание
)
[2] => Array
(
[tag] => PARA
[type] => close
[level] => 1
)
)
]]>
</screen>
</example>
</para>
<para>
Управляемый событиями разбор (основанный на библиотеке expat)
может дать труднообрабатываемый результат в случае, если разбирается
составной XML-документ. Эта функция не создаёт DOM-объектов, но
создаваемые ею массивы можно преобразовать в древовидную структуру
впоследствии. Таким образом можно довольно просто создавать объекты,
представляющие содержимое XML-файла. Предположим, что следующий XML файл
представляет небольшую базу данных с информацией об аминокислотах:
<example>
<title>
moldb.xml - небольшая база данных с информацией о молекулах
</title>
<programlisting role="xml">
<![CDATA[
<?xml version="1.0"?>
<moldb>
<molecule>
<name>Alanine</name>
<symbol>ala</symbol>
<code>A</code>
<type>hydrophobic</type>
</molecule>
<molecule>
<name>Lysine</name>
<symbol>lys</symbol>
<code>K</code>
<type>charged</type>
</molecule>
</moldb>
]]>
</programlisting>
</example>
Код, разбирающий документ и создающий подходящие объекты:
<example>
<title>
parsemoldb.php - разбирает moldb.xml и помещает данные в массив
молекул
</title>
<programlisting role="php">
<![CDATA[
<?php
class AminoAcid {
var $name; // название аминокислоты
var $symbol; // трёхбуквенное обозначение
var $code; // однобуквенный код
var $type; // гидрофобная, заряженная, нейтральная
function __construct ($aa)
{
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename)
{
// чтение XML-базы данных аминокислот
$data = file_get_contents($filename);
$parser = xml_parser_create();
xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1);
xml_parse_into_struct($parser, $data, $values, $tags);
unset($parser);
// проход через структуры
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// каждая смежная пара значений массивов является верхней и
// нижней границей определения молекулы
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = parseMol(array_slice($values, $offset, $len));
}
} else {
continue;
}
}
return $tdb;
}
function parseMol($mvalues)
{
for ($i=0; $i < count($mvalues); $i++) {
$mol[$mvalues[$i]["tag"]] = $mvalues[$i]["value"];
}
return new AminoAcid($mol);
}
$db = readDatabase("moldb.xml");
echo "** База данных аминокислот:\n";
print_r($db);
?>
]]>
</programlisting>
</example>
После выполнения <filename>parsemoldb.php</filename> переменная
<varname>$db</varname> содержит массив объектов
<classname>AminoAcid</classname>, а вывод соответственно следующий:
<informalexample>
<screen>
<![CDATA[
** База данных аминокислот:
Array
(
[0] => aminoacid Object
(
[name] => Alanine
[symbol] => ala
[code] => A
[type] => hydrophobic
)
[1] => aminoacid Object
(
[name] => Lysine
[symbol] => lys
[code] => K
[type] => charged
)
)
]]>
</screen>
</informalexample>
</para>
</refsect1>
</refentry>
<!-- 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
-->