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