Manual do PHP
Anterior |  | Próxima

# xml_parse_into_struct

(PHP 3>= 3.0.8, PHP 4 , PHP 5)

xml_parse_into_struct -- Analisa dados XML dentro de uma estrutura de array

## Descrição

int xml_parse_into_struct ( resource parser, string data, array &values [, array &index])

Esta função analisa uma arquivo XML dentro de 2 estruturas de array paralelas, um (index) contendo indicadores para a localização dos valores apropriados nos values do array. Estes dois últimos parâmetros deve ser passados por referência.

Abaixo tem um exemplo que ilustra a estrutura interna dos arrays sendo gerados pela função. Nós usamos uma simples note tag imbutida dentro da para tag, e quando nós analisamos isto exibe as estruturas geredas:

`<?php $simple = "<para><note>simple note</note></para>"; $p = xml_parser_create(); xml_parse_into_struct($p, $simple, $vals, $index); xml_parser_free($p); echo "Index array\n"; print_r($index); echo "\nVals array\n"; print_r($vals); ?>`

Quando nós executarmos o código, a saída será:

    Index array
    Array
    (
        [PARA] => Array
            (
                [0] => 0
                [1] => 2
            )

        [NOTE] => Array
            (
                [0] => 1
            )

    )

    Vals array
    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
            )

    )

Análise dirigida por eventos (Event-driven parsing) (baseada nabiblioteca do expat) pode complicado quando você tem um documento XML que é complexo. Esta função não produz um objeto no estilo DOM, mas gera estruturas cômodas de serem organizadas em uma forma de árvore. Assim, nós podemos criar objetos representando os dados nos arquivos facilmente. Vamos considerar o seguinte arquivo representando um pequeno banco de dados de informações de aminoácidos:

Exemplo 1. moldb.xml - pequeno banco de dados de informações moleculares

    <?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>

E alguns códigos para analisar o documento e gerar os obejetos apropriados:

Exemplo 2. parsemoldb.php - analisa moldb.xml e cria o array dos objetos moleculares

`<?php
class AminoAcid {
var $name; // aa name
var $symbol; // three letter symbol
var $code; // one letter code
var $type; // hydrophobic, charged or neutral
function AminoAcid ($aa) {
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename) {
// lê o banco de dados XML de aminoácidos
$data = implode("", file($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);
// loop through the structures
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// each contiguous pair of array entries are the
// lower and upper range for each molecule definition
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 "** Database of AminoAcid objects:\n";
print_r($db);
?>`

After executing `parsemoldb.php`, a variável $db contém um array dos objetos de AminoAcid, e a saída do script confirma isso:

    ** Database of AminoAcid objects:
    Array
    (
        [0] => aminoacid Object
            (
                [name] => Alanine
                [symbol] => ala
                [code] => A
                [type] => hydrophobic
            )

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

    )

Anterior | Principal | Próxima
xml_get_error_code | Acima | xml_parse