xml_parse_into_struct
(PHP 4, PHP 5)
xml_parse_into_struct — XML adatot tömbökbe pakol
LeÃrás
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.
Note: 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);
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:
Example#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>
Example#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);
?>
** 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 ) )