xml_parse_into_struct Разбор XML-данных и помещение в массив &reftitle.description; intxml_parse_into_struct XmlParserparser stringdata arrayvalues arrayindex&null; Эта функция разбирает XML-строку и помещает данные в 2 массива. Массив index содержит указатели на размещение значений в массиве values. Аргументы, задающие массивы, должны передаваться в функцию по ссылке. &reftitle.parameters; parser Ссылка на используемый XML-анализатор. data Строка XML-данных. values Массив значений XML-данных. index Массив указателей на соответствующие значения в массиве $values. &reftitle.returnvalues; xml_parse_into_struct возвращает 0 при неудачном разборе строки и 1 при успешном. Это не то же самое, что &false; и &true;, будьте осторожны с такими операторами, как ===. &reftitle.changelog; &Version; &Description; &xml.changelog.parser-param; &reftitle.examples; Ниже представлен пример, демонстрирующий внутреннее устройство массивов, генерируемых функцией. XML-строка содержит простой тег note вложенный в тег para. Программа в примере разбирает эту строку и выводит созданные массивы: Пример использования <function>xml_parse_into_struct</function> простое примечание"; $p = xml_parser_create(); xml_parse_into_struct($p, $simple, $vals, $index); xml_parser_free($p); echo "Массив index\n"; print_r($index); echo "\nМассив vals\n"; print_r($vals); ?> ]]> После обработки программа выведет следующее: Array ( [0] => 0 [1] => 2 ) [NOTE] => Array ( [0] => 1 ) ) Массив Vals Array ( [0] => Array ( [tag] => PARA [type] => open [level] => 1 ) [1] => Array ( [tag] => NOTE [type] => complete [level] => 2 [value] => простое примечание ) [2] => Array ( [tag] => PARA [type] => close [level] => 1 ) ) ]]> Управляемый событиями разбор (основанный на библиотеке expat) может дать труднообрабатываемый результат в случае, если разбирается составной XML-документ. Эта функция не создает DOM-объектов, но создаваемые ею массивы можно преобразовать в древовидную структуру впоследствии. Таким образом можно довольно просто создавать объекты, представляющие содержимое XML-файла. Предположим, что следующий XML файл представляет небольшую базу данных с информацией об аминокислотах: moldb.xml - небольшая база данных с информацией о молекулах Alanine ala A hydrophobic Lysine lys K charged ]]> Код, разбирающий документ и создающий подходящие объекты: parsemoldb.php - разбирает moldb.xml и помещает данные в массив молекул $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 "** База данных аминокислот:\n"; print_r($db); ?> ]]> После выполнения parsemoldb.php переменная $db содержит массив объектов AminoAcid, а вывод соответственно следующий: aminoacid Object ( [name] => Alanine [symbol] => ala [code] => A [type] => hydrophobic ) [1] => aminoacid Object ( [name] => Lysine [symbol] => lys [code] => K [type] => charged ) ) ]]>