PHP
XML

xml_parse_into_struct

xml_parse_into_struct

(PHP 4, PHP 5, PHP 7)

xml_parse_into_struct - 将XML数据解析为数组结构

描述

int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )

此函数将XML字符串解析为2个并行数组结构,其中一个(索引)包含指向values数组中适当值位置的指针。 后两个参数必须通过引用传递。

参数

parser

对XML解析器的引用。

data

包含XML数据的字符串。

values

包含XML数据值的数组

index

包含指向$值中相应值位置的指针的数组。

返回值

xml_parse_into_struct()返回0表示失败,1表示成功。 这与FALSE和TRUE不一样,请小心操作符,如===。

例子

下面是一个例子,说明函数生成的数组的内部结构。我们使用嵌入para 标签内的简单注释标签,然后解析并打印出生成的结构:

示例#1 xml_parse_into_struct()示例

<?php $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 ) )

当你有一个复杂的XML文档时,事件驱动的分析(基于expat库)会变得复杂。此函数不会生成DOM样式对象,但会生成适合以树形方式横切的结构。因此,我们可以很容易地在XML文件中创建表示数据的对象。我们来考虑下面的代表氨基酸信息小数据库的XML文件:

Example#2 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>

还有一些解析文档并生成适当对象的代码:

Example#3 parsemoldb.php - 将moldb.xml解析为分子对象数组

<?php class AminoAcid {     var $name;  // aa name     var $symbol;    // three letter symbol     var $code;  // one letter code     var $type;  // hydrophobic, charged 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     // loop through the structures     foreach ($tags as $key=>$val) {         if ($key == "molecule") {             $molranges = $val;             // each contiguous pair of array entries are the              // lower and upper range for each molecule definition             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 →