(PHP 4, PHP 5, PHP 7)
xml_parse_into_struct — Interpreta datos XML en una estructura de array
$parser
, string $data
, array &$values
[, array &$index
] )
Esta función interpreta una cadena 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.
parser
Una referencia para el interprete de XML.
data
Una cadena que contiene los datos XML.
values
Un array que contiene los valores de los datos XML.
index
Un array que contiene apuntadores hacia la ubicación de los valores apropiados en $values.
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 ===.
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:
Ejemplo #1 Ejemplo de xml_parse_into_struct()
<?php
$simple = "<para><note>Nota Simple</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:
Ejemplo #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>
Ejemplo #3 parsemoldb.php - interpreta moldb.xml dentro de un array de objetos moleculares
<?php
class AminoAcid {
var $name; // nombre aa
var $symbol; // símbolo de tres letras
var $code; // código de una letra
var $type; // hidrofóbico, cargado 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);
// repetir a través de las extructuras
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// cada par contiguo de netradas de array son los
// rangos altos y bajos para cada definición de molécula
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);
?>
** Base de datos de objetos AminoÁcidos: Array ( [0] => Objeto aminoácido ( [name] => Alanine [symbol] => ala [code] => A [type] => hydrophobic ) [1] => Objeto aminoácido ( [name] => Lysine [symbol] => lys [code] => K [type] => charged ) )