Функции Язык программирования PHP

xml_parse_into_struct

(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 ) )

Назад Оглавление Вперёд
xml_get_error_code Вверх xml_parse

Использование списка ресурсов

Пример E-9. Удаление существующего ресурса
pval 
*resource_id; RESOURCE *resource; int type; convert_to_long(resource_id); php3_list_delete(resource_id->value.lval);

Типы ресурсов должны быть зарегистрированы в php3_list.h, в enum list_entry_type. Кроме того, нужно добавить shutdown-код для любого вновь определённого типа ресурса в list.c's list_entry_destructor() (даже если вы ничего особенного при отключении/shutdown делать не хотите, вы обязаны добавить пустой case).