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