Files
php-doc-ru/reference/xml/functions/xml-parse-into-struct.xml
Sergey Panteleev 6d43fd64d7 Исправление форматирования
[skip-spellcheck]
[skip-lint]
2022-12-27 03:42:36 +03:00

322 lines
9.4 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: 4138897b1260ec3601c799cf4418f30ef8b29bce 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>int</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);
xml_parser_free($p);
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);
xml_parser_free($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
-->