Forum und email

xml_parse_into_struct

(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.

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

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>
és a következő programot, amely a megfelelő objektumokat állítja elő:

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

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

)