PHP kézikönyv
Előző |  | Következő

# xml_parse_into_struct

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

xml_parse_into_struct -- XML adatot tömbökbe pakol

## Leírás

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

Ez a függvény az XML fájlt 2 párhuzamos tömbbe rendezi, ezek közül az egyik, az index mutatókat tartalmaz a másik, a values elemeire. Ezeket a paramétereket referencia szerint kell átadni a függvény számára.

> Megjegyzés: Az index tömb az XML elemek nyitó és záró tag-jeit tartalmazza az elemzés időrendiségében, azaz adott elemhez tartozó címkék (tag-ek) nem feltétlenül egymás után, héjszerűen (egymásba ágyazva) szerepelnek. Az index tömb kulcsai a megtalált címkék nevei, a hozzájuk tartozó tömbök pedig indexeket tárolnak a values tömbhöz, ahol az adott címkéhez ill. az általa jelölt elemhez tartozó részletes információkat lehet megtalálni.

Az alábbi példa megvilágítja ezeknek a függvény által visszaadott tömböknek a belső felépítését és kapcsolataikat egymással. Ebben az egyszerű példában a para elem egy note elemet foglal magában:

`$xml = "<para><note>egyszerű kis megjegyzés</note></para>"; $parser = xml_parser_create(); xml_parse_into_struct($parser, $xml, $ertek, $index); xml_parser_free($parser); echo "indexek\n"; print_r($index); echo "\nertekek\n"; print_r($ertek);`

Futtatás után lássuk az így előálló szerkezeteket:

    indexek
    Array
    (
        [PARA] => Array
            (
                [0] => 0
                [1] => 2
            )

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

    )

    ertekek
    Array
    (
        [0] => Array
            (
                [tag] => PARA
                [type] => open
                [level] => 1
            )

        [1] => Array
            (
                [tag] => NOTE
                [type] => complete
                [level] => 2
                [value] => egyszerű kis megjegyzés
            )

        [2] => Array
            (
                [tag] => PARA
                [type] => close
                [level] => 1
            )

    )

Az epxat könyvtáron alapuló eseményvezérelt elemzés bonyolult lehet, ha az XML dokumentumnak összetett a szerkezete. Ez a függvény nem DOM stílusú objektumhierarchiát állít elő az elemzést követően, de olyan könnyen kezelhető szerkezetet ad, amit faszerűen fel lehet dolgozni. Ekképpen, könnyen lehet az XML-t ábrázoló objektumokat létrehozni. Vegyük példaként a következő XML állományt, amely az aminosavak kis információs adatbázisa:

Példa 1. moldb.xml - molekuláris adatok adatbázisa

    <?xml version="1.0"?>
    <moldb>

        <molecule>
            <name>Alanine</name>
            <symbol>ala</symbol>
            <code>A</code>
            <type>víztaszító?</type>
        </molecule>

        <molecule>
            <name>Lysine</name>
            <symbol>lys</symbol>
            <code>K</code>
            <type>telített</type>
        </molecule>

    </moldb>

és a következő programot, amely a megfelelő objektumokat állítja elő:

Példa 2. parsemoldb.php - beolvassa a moldb.xml-t

`<?php
class AminoAcid {
var $name; // animosav neve
var $symbol; // 3betűs rövidítés
var $code; // 1betűs kód
var $type; // víztaszító, telített vagy semleges
function AminoAcid ($aa) {
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename) {
// beolvassa az aminosavak XML adatbázisát
$adat = 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,$adat,$ertekek,$tagek);
xml_parser_free($parser);
// végighalad a tömbökön
foreach ($tagek as $key => $val) {
if ($key == "molecule") {
$molranges = $val;
// minden egymással határos tömbbejegyzés-pár a molekula
// definicójának alsó és felső határa
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = parseMol(array_slice($ertekek, $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 "** Aminosavak adatbázisa:\n";
print_r($db);
?>`

A `parsemoldb.php` futtatásával előálló $db változó fogja tárolni az AminoAcid típusú objektumok tömbjét, és a program kimenete a következő lesz:

    ** Aminosavak adatbázisa:
    Array
    (
        [0] => aminoacid Object
            (
                [name] => Alanine
                [symbol] => ala
                [code] => A
                [type] => víztaszító
            )

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

    )

Előző | Tartalom | Következő
xml_get_error_code | Fel | xml_parse