|
(PHP 3>= 3.0.8, PHP 4)
xml_parse_into_struct - разбирает XML-данные в структуру массива.
Описание
int xml_parse_into_struct (resource parser, string data, array &values, array &index)
Эта функция разбирает XML-файл на две параллельные структуры: одна из которых (
index
) содержит указатели на местонахождение соответствующих значений в массиве
values
array. Последние два параметра обязаны передаваться по ссылке.
Пример иллюстрирует внутреннюю структуру сгенерированных массивов. Мы используем простой тэг
note, встроенный в тэг para, а затем разбираем это и выводим сгенерированные структуры:
$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);
|
На выводе будет:
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
)
)
|
Разбор на основе событий (на основе библиотеки expat) может усложниться, если у вас сложный XML-документ.
Эта функция не производит объект в стиле DOM, а генерирует структуры,
отвечающие за то, чтобы быть пересечёнными в манере дерева. Таким образом, мы
может легко создавать объекты, представляющие данные в 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 на массив молекулярных объектов
<?php
class AminoAcid {
var $name; // имя aa
var $symbol; // трёхбуквенный символ
var $code; // однобуквенный код
var $type; // hydrophobic, charged или neutral
function AminoAcid ($aa) {
foreach ($aa as $k=>$v)
$this->$k = $aa[$k];
}
}
function readDatabase($filename) {
// читать xml БД аминокислот
$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);
// цикл по этим структурам
foreach ($tags as $key=>$val) {
if ($key == "molecule") {
$molranges = $val;
// каждая пара вхождений массива это нижняя и верхняя
// границы диапазона для определения каждой молекулы
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-объектов, и вывод скрипта подтверждает это:
** 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
)
)
|
|
|