xml_parse_into_struct
(PHP 4, PHP 5)
xml_parse_into_struct — Μεταγλωτίζει τα XML δεδομένα σε μια δομή πίνακα
Περιγραφή
Αυτή η συνάρτηση μεταγλωττίζει ένα XML αρχείο σε 2 παράλληλες δομές πινάκων, η μία (index ) περιέχει δείκτες στην περιοχή των κατάλληλων τιμών στον πίνακα των values . Αυτές οι τελευταίες δυο παράμετροι πρέπει να περαστούν με αναφορά.
Παρακάτω υπάρχει ένα παράδειγμα που δείχνει την εσωτερική δομή των πινάκων που παράγονται από μια τέτοια συνάρτηση. Χρησιμοποιούμε ένα απλό note tag που εμπεριέχετε μέσα σε ένα para tag, και στη συνέχεια μεταγλωτίζουμε αυτό και εκτυπώνουμε τις δομές που παράγονται:
<?php
$simple = "<para><note>simple note</note></para>";
$p = xml_parser_create();
xml_parse_into_struct($p,$simple,$vals,$index);
xml_parser_free($p);
echo "Index array\n";
print_r($index);
echo "\nVals array\n";
print_r($vals);
?>
When we run that code, the output will be:
Index array Array ( [PARA] => Array ( [0] => 0 [1] => 2 ) [NOTE] => Array ( [0] => 1 ) ) Vals array Array ( [0] => Array ( [tag] => PARA [type] => open [level] => 1 ) [1] => Array ( [tag] => NOTE [type] => complete [level] => 2 [value] => simple note ) [2] => Array ( [tag] => PARA [type] => close [level] => 1 ) )
Η μεταγλώττιση που είναι Event-driven (βασισμένη στην expat library) μπορεί να γίνει περίπλοκη όταν έχετε ένα XML αρχείο που είναι περίπλοκο. Αυτή η συνάρτηση δεν παράγει ένα DOM style object, αλλά παράγει δομές που μπορούν να προσπελαστούν όπως ένα δέντρο. Συνεπώς, μπορούμε να δημιουργήσουμε objects εύκολα που αναπαριστούν δεδομένα στο XML αρχείο. Ας θεωρήσουμε το ακόλουθο XML αρχείο που αναπαριστά μια μικρή βάση δεοδμένων από πληροφορίες για αμινοξέα:
Example#1 moldb.xml - μικρή βάση δεδομένων για μοριακές πληροφορίες
<?xml version="1.0"?> <moldb> <molecule> <name>Alanine</name> <symbol>ala</symbol> <code>A</code> <type>hydrophobic</type> </molecule> <molecule> <name>Lysine</name> <symbol>lys</symbol> <code>K</code> <type>charged</type> </molecule> </moldb>
Example#2 parsemoldb.php - μεταγλωττίζει το moldb.xml και των πίνακα των objects με τα μόρια
<?php
class AminoAcid {
var $name; // aa name
var $symbol; // three letter symbol
var $code; // one letter code
var $type; // hydrophobic, charged or neutral
function AminoAcid ($aa) {
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename) {
// read the xml database of aminoacids
$data = 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,$data,$values,$tags);
xml_parser_free($parser);
// loop through the structures
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// each contiguous pair of array entries are the
// lower and upper range for each molecule definition
for ($i=0; $i < count($molranges); $i+=2) {
$offset = $molranges[$i] + 1;
$len = $molranges[$i + 1] - $offset;
$tdb[] = parseMol(array_slice($values, $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 "** Database of AminoAcid objects:\n";
print_r($db);
?>
** Database of AminoAcid objects: Array ( [0] => aminoacid Object ( [name] => Alanine [symbol] => ala [code] => A [type] => hydrophobic ) [1] => aminoacid Object ( [name] => Lysine [symbol] => lys [code] => K [type] => charged ) )