<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/ref.xml.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'pt_BR',
  ),
  'this' => 
  array (
    0 => 'function.xml-parse-into-struct.php',
    1 => 'xml_parse_into_struct',
    2 => 'Analisa dados XML dentro de uma estrutura de array',
  ),
  'up' => 
  array (
    0 => 'ref.xml.php',
    1 => 'Fun&ccedil;&otilde;es para analisar XML',
  ),
  'prev' => 
  array (
    0 => 'function.xml-parse.php',
    1 => 'xml_parse',
  ),
  'next' => 
  array (
    0 => 'function.xml-parser-create.php',
    1 => 'xml_parser_create',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'pt_BR',
    'path' => 'reference/xml/functions/xml-parse-into-struct.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="function.xml-parse-into-struct" class="refentry">
 <div class="refnamediv">
  <h1 class="refname">xml_parse_into_struct</h1>
  <p class="verinfo">(PHP 4, PHP 5, PHP 7, PHP 8)</p><p class="refpurpose"><span class="refname">xml_parse_into_struct</span> &mdash; <span class="dc-title">Analisa dados XML dentro de uma estrutura de array</span></p>

 </div>

 <div class="refsect1 description" id="refsect1-function.xml-parse-into-struct-description">
  <h3 class="title">Descrição</h3>
  <div class="methodsynopsis dc-description">
   <span class="methodname"><strong>xml_parse_into_struct</strong></span>(<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="class.xmlparser.php" class="type XMLParser">XMLParser</a></span> <code class="parameter">$parser</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.string.php" class="type string">string</a></span> <code class="parameter">$data</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter reference">&$values</code></span>,<br>&nbsp;&nbsp;&nbsp;&nbsp;<span class="methodparam"><span class="type"><a href="language.types.array.php" class="type array">array</a></span> <code class="parameter reference">&$index</code><span class="initializer"> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong></span></span><br>): <span class="type"><span class="type"><a href="language.types.integer.php" class="type int">int</a></span>|<span class="type"><a href="language.types.singleton.php" class="type false">false</a></span></span></div>

  <p class="para rdfs-comment">
   Esta função analisa uma string XML para 2 estruturas de array paralelas,
   uma (<code class="parameter">index</code>) contendo indicadores para a localização dos
   valores apropriados no array identificado por <code class="parameter">values</code>. Estes dois
   últimos parâmetros deve ser passados por referência.
  </p>
 </div>


 <div class="refsect1 parameters" id="refsect1-function.xml-parse-into-struct-parameters">
  <h3 class="title">Parâmetros</h3>
  <p class="para">
   <dl>
    
     <dt><code class="parameter">parser</code></dt>
     <dd>
      <p class="para">
       Uma referência ao analisador XML.
      </p>
     </dd>
    
    
     <dt><code class="parameter">data</code></dt>
     <dd>
      <p class="para">
       Uma string contendo os dados XML.
      </p>
     </dd>
    
    
     <dt><code class="parameter">values</code></dt>
     <dd>
      <p class="para">
       Um array contendo os valores do dados XML
      </p>
     </dd>
    
    
     <dt><code class="parameter">index</code></dt>
     <dd>
      <p class="para">
       Um array contendo ponteiros para a localização dos valores apropriados em $values.
      </p>
     </dd>
    
   </dl>
  </p>
 </div>


 <div class="refsect1 returnvalues" id="refsect1-function.xml-parse-into-struct-returnvalues">
  <h3 class="title">Valor Retornado</h3>
  <p class="para">
   <span class="function"><strong>xml_parse_into_struct()</strong></span> retorna 0 para falha e 1 para
   sucesso. Isto não é o mesmo que <strong><code><a href="reserved.constants.php#constant.false">false</a></code></strong> e <strong><code><a href="reserved.constants.php#constant.true">true</a></code></strong>, deve-se ter cuidado ao usar
   operadores como ===.
  </p>
 </div>


 <div class="refsect1 changelog" id="refsect1-function.xml-parse-into-struct-changelog">
  <h3 class="title">Registro de Alterações</h3>
  <table class="doctable informaltable">
   
    <thead>
     <tr>
      <th>Versão</th>
      <th>Descrição</th>
     </tr>

    </thead>

    <tbody class="tbody">
     <tr>
 <td>8.0.0</td>
 <td>
  O parâmetro <code class="parameter">parser</code> agora espera uma instância de <span class="classname"><a href="class.xmlparser.php" class="classname">XMLParser</a></span>;
  anteriormente, um <span class="type"><a href="language.types.resource.php" class="type resource">resource</a></span> <code class="literal">xml</code> válido era esperado.
 </td>
</tr>

    </tbody>
   
  </table>

 </div>


 <div class="refsect1 examples" id="refsect1-function.xml-parse-into-struct-examples">
  <h3 class="title">Exemplos</h3>
  <p class="para">
   Abaixo há um exemplo que ilustra a estrutura interna
   dos arrays sendo gerados pela função. Será usada uma simples
   etiqueta <code class="literal">note</code> embutida dentro da
   etiqueta <code class="literal">para</code>, e então será feita análise e depois mostradas
   as estruturas geredas:
   <div class="example" id="example-1">
    <p><strong>Exemplo #1 Exemplo de <span class="function"><strong>xml_parse_into_struct()</strong></span></strong></p>
    <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$simple </span><span style="color: #007700">= </span><span style="color: #DD0000">"&lt;para&gt;&lt;note&gt;simple note&lt;/note&gt;&lt;/para&gt;"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">$p </span><span style="color: #007700">= </span><span style="color: #0000BB">xml_parser_create</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">xml_parse_into_struct</span><span style="color: #007700">(</span><span style="color: #0000BB">$p</span><span style="color: #007700">, </span><span style="color: #0000BB">$simple</span><span style="color: #007700">, </span><span style="color: #0000BB">$vals</span><span style="color: #007700">, </span><span style="color: #0000BB">$index</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"Array de índices\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$index</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"\nArray de valores\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$vals</span><span style="color: #007700">);<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    <div class="example-contents"><p>
     Ao executar o código, a saída será:
    </p></div>
    <div class="example-contents screen">
<div class="annotation-interactive examplescode"><pre class="examplescode">Array de índices
Array
(
    [PARA] =&gt; Array
        (
            [0] =&gt; 0
            [1] =&gt; 2
        )

    [NOTE] =&gt; Array
        (
            [0] =&gt; 1
        )

)

Array de valores
Array
(
    [0] =&gt; Array
        (
            [tag] =&gt; PARA
            [type] =&gt; open
            [level] =&gt; 1
        )

    [1] =&gt; Array
        (
            [tag] =&gt; NOTE
            [type] =&gt; complete
            [level] =&gt; 2
            [value] =&gt; simple note
        )

    [2] =&gt; Array
        (
            [tag] =&gt; PARA
            [type] =&gt; close
            [level] =&gt; 1
        )

)</pre>
</div>
    </div>
   </div>
  </p>
  <p class="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:
   <div class="example" id="example-2">
    <p><strong>Exemplo #2 moldb.xml - pequeno banco de dados de informações moleculares</strong></p>
    <div class="example-contents">
<div class="annotation-interactive xmlcode"><pre class="xmlcode">&lt;?xml version=&quot;1.0&quot;?&gt;
&lt;moldb&gt;

    &lt;molecule&gt;
        &lt;name&gt;Alanine&lt;/name&gt;
        &lt;symbol&gt;ala&lt;/symbol&gt;
        &lt;code&gt;A&lt;/code&gt;
        &lt;type&gt;hydrophobic&lt;/type&gt;
    &lt;/molecule&gt;

    &lt;molecule&gt;
        &lt;name&gt;Lysine&lt;/name&gt;
        &lt;symbol&gt;lys&lt;/symbol&gt;
        &lt;code&gt;K&lt;/code&gt;
        &lt;type&gt;charged&lt;/type&gt;
    &lt;/molecule&gt;

&lt;/moldb&gt;</pre>
</div>
      </div>

     </div>
     E um pouco de código para analisar o documento e gerar os objetos
     apropriados:
     <div class="example" id="example-3">
      <p><strong>Exemplo #3 
       parsemoldb.php - analisa moldb.xml e cria o array
       dos objetos moleculares
      </strong></p>
      <div class="example-contents">
<div class="annotation-interactive phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /><br /></span><span style="color: #007700">class </span><span style="color: #0000BB">AminoAcid </span><span style="color: #007700">{<br />    var </span><span style="color: #0000BB">$name</span><span style="color: #007700">;  </span><span style="color: #FF8000">// nome do aminoácido<br />    </span><span style="color: #007700">var </span><span style="color: #0000BB">$symbol</span><span style="color: #007700">;    </span><span style="color: #FF8000">// símbolo de 3 letras<br />    </span><span style="color: #007700">var </span><span style="color: #0000BB">$code</span><span style="color: #007700">;  </span><span style="color: #FF8000">// código de 1 letra<br />    </span><span style="color: #007700">var </span><span style="color: #0000BB">$type</span><span style="color: #007700">;  </span><span style="color: #FF8000">// hidrofóbico, carregado ou natural<br /><br />    </span><span style="color: #007700">function </span><span style="color: #0000BB">__construct </span><span style="color: #007700">(</span><span style="color: #0000BB">$aa</span><span style="color: #007700">)<br />    {<br />        foreach (</span><span style="color: #0000BB">$aa </span><span style="color: #007700">as </span><span style="color: #0000BB">$k</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$v</span><span style="color: #007700">)<br />            </span><span style="color: #0000BB">$this</span><span style="color: #007700">-&gt;</span><span style="color: #0000BB">$k </span><span style="color: #007700">= </span><span style="color: #0000BB">$aa</span><span style="color: #007700">[</span><span style="color: #0000BB">$k</span><span style="color: #007700">];<br />    }<br />}<br /><br />function </span><span style="color: #0000BB">readDatabase</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">)<br />{<br />    </span><span style="color: #FF8000">// lê o banco de dados XML de aminoácidos<br />    </span><span style="color: #0000BB">$data </span><span style="color: #007700">= </span><span style="color: #0000BB">file_get_contents</span><span style="color: #007700">(</span><span style="color: #0000BB">$filename</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">$parser </span><span style="color: #007700">= </span><span style="color: #0000BB">xml_parser_create</span><span style="color: #007700">();<br />    </span><span style="color: #0000BB">xml_parser_set_option</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">XML_OPTION_CASE_FOLDING</span><span style="color: #007700">, </span><span style="color: #0000BB">0</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">xml_parser_set_option</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">XML_OPTION_SKIP_WHITE</span><span style="color: #007700">, </span><span style="color: #0000BB">1</span><span style="color: #007700">);<br />    </span><span style="color: #0000BB">xml_parse_into_struct</span><span style="color: #007700">(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">, </span><span style="color: #0000BB">$data</span><span style="color: #007700">, </span><span style="color: #0000BB">$values</span><span style="color: #007700">, </span><span style="color: #0000BB">$tags</span><span style="color: #007700">);<br />    unset(</span><span style="color: #0000BB">$parser</span><span style="color: #007700">);<br /><br />    </span><span style="color: #FF8000">// faz um loop pelas estruturas<br />    </span><span style="color: #007700">foreach (</span><span style="color: #0000BB">$tags </span><span style="color: #007700">as </span><span style="color: #0000BB">$key</span><span style="color: #007700">=&gt;</span><span style="color: #0000BB">$val</span><span style="color: #007700">) {<br />        if (</span><span style="color: #0000BB">$key </span><span style="color: #007700">== </span><span style="color: #DD0000">"molecule"</span><span style="color: #007700">) {<br />            </span><span style="color: #0000BB">$molranges </span><span style="color: #007700">= </span><span style="color: #0000BB">$val</span><span style="color: #007700">;<br />            </span><span style="color: #FF8000">// cada par contíguo de entradas do array são os limites<br />            // inferiores e superiores para cada definição de molécula<br />            </span><span style="color: #007700">for (</span><span style="color: #0000BB">$i</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #0000BB">$i </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$molranges</span><span style="color: #007700">); </span><span style="color: #0000BB">$i</span><span style="color: #007700">+=</span><span style="color: #0000BB">2</span><span style="color: #007700">) {<br />                    </span><span style="color: #0000BB">$offset </span><span style="color: #007700">= </span><span style="color: #0000BB">$molranges</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">] + </span><span style="color: #0000BB">1</span><span style="color: #007700">;<br />                </span><span style="color: #0000BB">$len </span><span style="color: #007700">= </span><span style="color: #0000BB">$molranges</span><span style="color: #007700">[</span><span style="color: #0000BB">$i </span><span style="color: #007700">+ </span><span style="color: #0000BB">1</span><span style="color: #007700">] - </span><span style="color: #0000BB">$offset</span><span style="color: #007700">;<br />                </span><span style="color: #0000BB">$tdb</span><span style="color: #007700">[] = </span><span style="color: #0000BB">parseMol</span><span style="color: #007700">(</span><span style="color: #0000BB">array_slice</span><span style="color: #007700">(</span><span style="color: #0000BB">$values</span><span style="color: #007700">, </span><span style="color: #0000BB">$offset</span><span style="color: #007700">, </span><span style="color: #0000BB">$len</span><span style="color: #007700">));<br />            }<br />        } else {<br />            continue;<br />        }<br />    }<br />    return </span><span style="color: #0000BB">$tdb</span><span style="color: #007700">;<br />}<br /><br />function </span><span style="color: #0000BB">parseMol</span><span style="color: #007700">(</span><span style="color: #0000BB">$mvalues</span><span style="color: #007700">)<br />{<br />    for (</span><span style="color: #0000BB">$i</span><span style="color: #007700">=</span><span style="color: #0000BB">0</span><span style="color: #007700">; </span><span style="color: #0000BB">$i </span><span style="color: #007700">&lt; </span><span style="color: #0000BB">count</span><span style="color: #007700">(</span><span style="color: #0000BB">$mvalues</span><span style="color: #007700">); </span><span style="color: #0000BB">$i</span><span style="color: #007700">++) {<br />        </span><span style="color: #0000BB">$mol</span><span style="color: #007700">[</span><span style="color: #0000BB">$mvalues</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">][</span><span style="color: #DD0000">"tag"</span><span style="color: #007700">]] = </span><span style="color: #0000BB">$mvalues</span><span style="color: #007700">[</span><span style="color: #0000BB">$i</span><span style="color: #007700">][</span><span style="color: #DD0000">"value"</span><span style="color: #007700">];<br />    }<br />    return new </span><span style="color: #0000BB">AminoAcid</span><span style="color: #007700">(</span><span style="color: #0000BB">$mol</span><span style="color: #007700">);<br />}<br /><br /></span><span style="color: #0000BB">$db </span><span style="color: #007700">= </span><span style="color: #0000BB">readDatabase</span><span style="color: #007700">(</span><span style="color: #DD0000">"moldb.xml"</span><span style="color: #007700">);<br />echo </span><span style="color: #DD0000">"** Banco de Dados de objetos de Aminoácidos:\n"</span><span style="color: #007700">;<br /></span><span style="color: #0000BB">print_r</span><span style="color: #007700">(</span><span style="color: #0000BB">$db</span><span style="color: #007700">);<br /><br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
      </div>

     </div>
     Depois de executar <var class="filename">parsemoldb.php</var>, a variável
     <var class="varname">$db</var> conterá um array dos objetos de
     <span class="classname"><strong class="classname">AminoAcid</strong></span>, e a saída do
     script confirma isso:
  <div class="informalexample">
      <div class="example-contents screen">
<div class="annotation-interactive examplescode"><pre class="examplescode">** Banco de Dados de objetos de Aminoácidos:
Array
(
    [0] =&gt; aminoacid Object
        (
            [name] =&gt; Alanine
            [symbol] =&gt; ala
            [code] =&gt; A
            [type] =&gt; hydrophobic
        )

    [1] =&gt; aminoacid Object
        (
            [name] =&gt; Lysine
            [symbol] =&gt; lys
            [code] =&gt; K
            [type] =&gt; charged
        )

)</pre>
</div>
    </div>
   </div>
  </p>
 </div>


</div><?php manual_footer($setup); ?>