xml_parse_into_struct - разбирает XML-данные в структуру массива.
Описание
int xml_parse_into_struct (resource parser, string data, array &values, array &index)
Эта функция разбирает XML-файл на две параллельные структуры: одна из которых (index) содержит указатели на местонахождение соответствующих значений в массиве
values array. Последние два параметра обязаны передаваться по ссылке.
Пример иллюстрирует внутреннюю структуру сгенерированных массивов. Мы используем простой тэг
note, встроенный в тэг para, а затем разбираем это и выводим сгенерированные структуры:
Разбор на основе событий (на основе библиотеки expat) может усложниться, если у вас сложный XML-документ.
Эта функция не производит объект в стиле DOM, а генерирует структуры,
отвечающие за то, чтобы быть пересечёнными в манере дерева. Таким образом, мы
может легко создавать объекты, представляющие данные в XML-файле. Рассмотрим
следующий XML-файл, представляющий собой небольшую БД с информацией об аминокислотах:
Пример 1. moldb.xml - небольшая БД с молекулярной информацией
и небольшой код для разбора документа и генерации соответствующих объектов:
Пример 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:
";
print_r($db);
?>
После выполнения parsemoldb.php переменная $db содержит массив
AminoAcid-объектов, и вывод скрипта подтверждает это: