xml_parse_into_struct
(PHP 3 >= 3.0.8, PHP 4, PHP 5)
xml_parse_into_struct -- Μεταγλωτίζει τα XML δεδομένα σε μια δομή πίνακα
Περιγραφή
int
xml_parse_into_struct ( resource parser, string data, array &values [, array &index] )
Αυτή η συνάρτηση μεταγλωττίζει ένα XML αρχείο σε 2 παράλληλες δομές
πινάκων, η μία (index) περιέχει δείκτες
στην περιοχή των κατάλληλων τιμών στον πίνακα των
values . Αυτές οι τελευταίες δυο παράμετροι
πρέπει να περαστούν με αναφορά.
Παρακάτω υπάρχει ένα παράδειγμα που δείχνει την εσωτερική δομή των
πινάκων που παράγονται από μια τέτοια συνάρτηση. Χρησιμοποιούμε ένα απλό
note tag που εμπεριέχετε μέσα σε ένα
para tag, και στη συνέχεια μεταγλωτίζουμε αυτό και
εκτυπώνουμε τις δομές που παράγονται:
Η μεταγλώττιση που είναι Event-driven (βασισμένη στην expat library) μπορεί να
γίνει περίπλοκη όταν έχετε ένα XML αρχείο που είναι περίπλοκο.
Αυτή η συνάρτηση δεν παράγει ένα DOM style object, αλλά
παράγει δομές που μπορούν να προσπελαστούν όπως ένα
δέντρο. Συνεπώς, μπορούμε να δημιουργήσουμε objects εύκολα που αναπαριστούν δεδομένα
στο XML αρχείο. Ας θεωρήσουμε το ακόλουθο XML αρχείο
που αναπαριστά μια μικρή βάση δεοδμένων από πληροφορίες για αμινοξέα:
ÐáñÜäåéãìá 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> |
|
Και λίγος κώδικας για να μεταγλωττιστεί το αρχείο και να παραχθούν τα κατάλληλα
αντικείμενα:
ÐáñÜäåéãìá 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);
?>
|
|
Αφού εκτελεστεί το
parsemoldb.php, η μεταβλητή
$db περιέχει έναν πίνακα από
AminoAcid objects, και το αποτέλεσμα του
script επιβεβαιώνει ότι: