Forum und email

xml_parse_into_struct

(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, και στη συνέχεια μεταγλωτίζουμε αυτό και εκτυπώνουμε τις δομές που παράγονται:

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

?>
Αφού εκτελεστεί το parsemoldb.php, η μεταβλητή $db περιέχει έναν πίνακα από AminoAcid objects, και το αποτέλεσμα του script επιβεβαιώνει ότι:
** 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
        )

)