XML Parser Funzioni
PHP Manual

xml_parse_into_struct

(PHP 4, PHP 5)

xml_parse_into_structAnalizza i dati XML in una struttura array

Descrizione

int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )

Questa funzione analizza una stringa XML in 2 strutture array parallele, una (index) contiene i puntatori alla posizione dei valori opportuni nell'array values. Quest'ultimi due parametri devono essere passati per riferimento.

Elenco dei parametri

parser

Un riferimento al parser XML.

data

Una stringa contenente i dati XML.

values

Una array contenente i valori dei dati XML

index

Un array contenente i puntatori alla posizione degli opportuni valori in $values.

Valori restituiti

xml_parse_into_struct() restituisce 0 per fallimento e 1 per successo. Questo non è lo stesso di FALSE e TRUE, fare attenzione con gli operatori come ===.

Esempi

Nell'esempio seguente si illustra la struttura interna degli array generati da questa funzione. Utilizziamo un semplice tag note incorporato all'interno di un tag para, e quindi lo si analizzerà e stamperemo le strutture generate:

Example #1 Esempio di uso xml_parse_into_struct()

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

Eseguendo questo codice si avrà come output:

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
        )

)

Un parsing event-driven (basato sulla libreria expat) può essere molto complicato se si deve trattare un documento XML complesso. Questa funzione non produce un oggetto in stile DOM, ma genera una struttura che permette di essere gestita a modo di albero. Quindi si possono facilmente creare oggetti rappresentanti i dati del file XML. Si consideri il seguente file XML rappresentante un piccolo database di informazioni sugli aminoacidi.

Example #2 moldb.xml - piccolo database di informazioni sulle molecole

<?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>
Un codice per analizzare il documento e generare gli oggetti appropriati:

Example #3 parsemoldb.php - analizza moldb.xml in un array di oggetti molecolari

<?php

class AminoAcid {
    var 
$name;  // nome aa
    
var $symbol;    // simbolo di tre lettere
    
var $code;  // codice di una lettera
    
var $type;  // idrofobo, carico o neutro
    
    
function AminoAcid ($aa
    {
        foreach (
$aa as $k=>$v)
            
$this->$k $aa[$k];
    }
}

function 
readDatabase($filename
{
    
// legge il database XML di amminoacidi
    
$data implode(""file($filename));
    
$parser xml_parser_create();
    
xml_parser_set_option($parserXML_OPTION_CASE_FOLDING0);
    
xml_parser_set_option($parserXML_OPTION_SKIP_WHITE1);
    
xml_parse_into_struct($parser$data$values$tags);
    
xml_parser_free($parser);

    
// cicla attraverso le strutture
    
foreach ($tags as $key=>$val) {
        if (
$key == "molecule") {
            
$molranges $val;
            
// ciascuna coppia di elementi contigua dell'array è
            // l'intervallo inferiore o superiore per la definizione di ciascuna molecola
            
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 degli oggetti Aminoacidi:\n";
print_r($db);

?>
Dopo l'esecuzione di parsemoldb.php, la variabile $db contiene un array di oggetti AminoAcid, e ciò viene confermato dall'output dello script:
** Database di oggetti Aminoacidi:
Array
(
    [0] => aminoacid Object
        (
            [name] => Alanine
            [symbol] => ala
            [code] => A
            [type] => hydrophobic
        )

    [1] => aminoacid Object
        (
            [name] => Lysine
            [symbol] => lys
            [code] => K
            [type] => charged
        )

)


XML Parser Funzioni
PHP Manual