Files
archived-doc-pt-br/reference/xml/functions/xml-parse-into-struct.xml
Leonardo Lara Rodrigues b8e6f6b888 sync with en rev
2025-10-21 09:03:14 -03:00

321 lines
8.2 KiB
XML

<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: b47e4bea197126359815c5e43403c4b77a0aaaa7 Maintainer: leonardolara Status: ready --><!-- CREDITS: surfmax,felipe,leonardolara -->
<refentry xml:id="function.xml-parse-into-struct" xmlns="http://docbook.org/ns/docbook">
<refnamediv>
<refname>xml_parse_into_struct</refname>
<refpurpose>Analisa dados XML dentro de uma estrutura de array</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>
Esta função analisa uma string XML para 2 estruturas de array paralelas,
uma (<parameter>index</parameter>) contendo indicadores para a localização dos
valores apropriados no array identificado por <parameter>values</parameter>. Estes dois
últimos parâmetros deve ser passados por referência.
</para>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>parser</parameter></term>
<listitem>
<para>
Uma referência ao analisador XML.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>data</parameter></term>
<listitem>
<para>
Uma string contendo os dados XML.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>values</parameter></term>
<listitem>
<para>
Um array contendo os valores do dados XML
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><parameter>index</parameter></term>
<listitem>
<para>
Um array contendo ponteiros para a localização dos valores apropriados em $values.
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
<function>xml_parse_into_struct</function> retorna 0 para falha e 1 para
sucesso. Isto não é o mesmo que &false; e &true;, deve-se ter cuidado ao usar
operadores como ===.
</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>
Abaixo há um exemplo que ilustra a estrutura interna
dos arrays sendo gerados pela função. Será usada uma simples
etiqueta <literal>note</literal> embutida dentro da
etiqueta <literal>para</literal>, e então será feita análise e depois mostradas
as estruturas geredas:
<example>
<title>Exemplo de <function>xml_parse_into_struct</function></title>
<programlisting role="php">
<![CDATA[
<?php
$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p, $simple, $vals, $index);
echo "Array de índices\n";
print_r($index);
echo "\nArray de valores\n";
print_r($vals);
?>
]]>
</programlisting>
<para>
Ao executar o código, a saída será:
</para>
<screen>
<![CDATA[
Array de índices
Array
(
[PARA] => Array
(
[0] => 0
[1] => 2
)
[NOTE] => Array
(
[0] => 1
)
)
Array de valores
Array
(
[0] => Array
(
[tag] => PARA
[type] => open
[level] => 1
)
[1] => Array
(
[tag] => NOTE
[type] => complete
[level] => 2
[value] => simple note
)
[2] => Array
(
[tag] => PARA
[type] => close
[level] => 1
)
)
]]>
</screen>
</example>
</para>
<para>
Análise guiada por eventos (baseada na biblioteca expat) pode se tornar
complicada quando se tem um documento XML complexo.
Esta função não produz um objeto no estilo DOM, mas gera
estruturas passíveis de serem organizadas em forma de
árvore. Assim, pode-se criar objetos representando os dados
no arquivo XML facilmente. Considere o seguinte arquivo XML
representando um pequeno banco de dados de informações de aminoácidos:
<example>
<title>moldb.xml - pequeno banco de dados de informações moleculares</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>
E um pouco de código para analisar o documento e gerar os objetos
apropriados:
<example>
<title>
parsemoldb.php - analisa moldb.xml e cria o array
dos objetos moleculares
</title>
<programlisting role="php">
<![CDATA[
<?php
class AminoAcid {
var $name; // nome do aminoácido
var $symbol; // símbolo de 3 letras
var $code; // código de 1 letra
var $type; // hidrofóbico, carregado ou natural
function __construct ($aa)
{
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename)
{
// lê o banco de dados XML de aminoácidos
$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);
// faz um loop pelas estruturas
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// cada par contíguo de entradas do array são os limites
// inferiores e superiores para cada definição de molécula
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 "** Banco de Dados de objetos de Aminoácidos:\n";
print_r($db);
?>
]]>
</programlisting>
</example>
Depois de executar <filename>parsemoldb.php</filename>, a variável
<varname>$db</varname> conterá um array dos objetos de
<classname>AminoAcid</classname>, e a saída do
script confirma isso:
<informalexample>
<screen>
<![CDATA[
** Banco de Dados de objetos de Aminoácidos:
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
-->