xml_parse_into_struct

(PHP 3>= 3.0.8, PHP 4 )

xml_parse_into_struct -- XML adatot tömbökbe pakol

Leírás

int xml_parse_into_struct ( int 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ó tag-ek nem feltétlenül egymás után vagy héjszerűen (egymásba ágyazva) szerepelnek. Az index tömb kulcsai a megtalált tag-ek nevei, a hozzájuk tartozó tömbök pedig indexeket tárolnak a values tömbhöz, ahol az adott tag-hez 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 fa szerű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ő objektumoket á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
        )

)