XML Parser Funciones
PHP Manual

xml_parse_into_struct

(PHP 4, PHP 5)

xml_parse_into_structInterpreta datos XML en una estructura de array

Descripción

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

Esta función interpreta un archivo XML en dos estructuras paralelas de array, una (index) que contiene punteros a la ubicación de los valores adecuados en el array values. Estos dos últimos parámetros deben ser pasados por referencia.

Parámetros

parser

data

values

index

Valores devueltos

xml_parse_into_struct() retorna 0 cuando falla y 1 si es exitoso. Esto no es lo mismo que FALSE y TRUE, tener cuidado con operadores tales como ===.

Ejemplos

A continuación se muestra un ejemplo que ilustra la estructura interna de los arrays que se generan por la función. Se usa una etiqueta simple note incrustada dentro de una etiqueta para y entonces esto se interpreta y se muestran las estructuras generadas:

Example #1 Ejemplo de 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);
?>

Cuando se ejecuta este código, la salida será:

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
        )

)

El análisis por eventos (basado en la biblioteca expat) puede ser más complicado cuando se tiene un documento XML que es complejo. Esta función no produce un objeto de estilo DOM, pero genera estructuras susceptibles de ser transversionadas en forma de árbol. Por lo tanto, se pueden crear objetos que representan los datos en el archivo XML con facilidad. Considere el siguiente archivo XML que representa una pequeña base de datos con información de aminoácidos:

Example #2 moldb.xml - pequeña base de datos de información molecular

<?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>
Y algo de código para interpretar el documento y generar los objetos adecuados:

Example #3 parsemoldb.php - interpreta moldb.xml en un array de objetos moleculares

<?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($parserXML_OPTION_CASE_FOLDING0);
    
xml_parser_set_option($parserXML_OPTION_SKIP_WHITE1);
    
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);

?>
Después de ejecutar parsemoldb.php, la variable $db contiene un array de objetos de AminoAcid y la salida del script confirma que:
** 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
        )

)


XML Parser Funciones
PHP Manual