首页 > PHP开发 > PHP xml_parse_into_struct 函数详细解析

PHP xml_parse_into_struct 函数详细解析

函数原型:int xml_parse_into_struct ( resource $parser , string $data , array &$values [, array &$index ] )

参数说明:@param-->$parser XML解析器,由xml_parser_create()生成一个XML资源句柄。

    @param-->$data  带解析的XML字符串。

   @param--> &$value 解析完成后生成的数据数组。

通常包括:1. 标签名字,例如<bookname>parse xml sources</bookname>,则标签名字为:bookname

    2. 标签所处状态(或者说是类型),<bookname>parse xml sources</bookname>,当解析器读取到<bookname>,则标签类型为:open(开启状态),当解析器读取到</bookname>时,则标签类型为:close(闭合状态)

  3. 当前元素所处XML解析数的第几层(XML通常被解析为一颗倒置树,根(顶层元素)处于第一层 )比如  <book><bookname>parse xml sources</bookname><authors>aaaa, bbbb</authors></book>中,book标签所标记的元素处于解析数的第一层,即level为1, bookname和authors标签所标记的元素都处于解析数的第二层,即level为2

4. 可选的值。在例子<book><bookname>parse xml sources</bookname><authors>aaaa, bbbb</authors></book>中,bookname标签所标记的取值为字符串 " parse xml sources" ,authors标签所标记的取值为字符串" aaaa,bbbb" 。 而book标签所标记的元素没有直接的字符结点所以取值为空(或者NULL)

@param-->&$index  解析完成后生成的对应数组$value中元素取值的索引数组,从 0 开始统计。比如在 <book><bookname>parse xml sources</bookname><authors>aaaa, bbbb</authors></book>中,<book>所代表的其实标签处于索引数组中的0位置,<bookname>parse xml sources</bookname>所代表的结点处于索引数组中的位置为1, <authors>aaaa, bbbb</authors>所代表的结点在索引数组中的位置为2,</book>所代表的闭合标签所处的位置则为3, 所以book所代表的取值范围为book{0,3},bookname的取值范围为bookname{1}, authors的取值范围为authors{2}

举例:

[php]

  1. <?php  
  2. $xml=<<<XML  
  3. <?xml version="1.0"?>  
  4. <moldb>  
  5.     <molecule>  
  6.         <name>Alanine</name>  
  7.         <symbol>ala</symbol>  
  8.         <code>A</code>  
  9.         <type>hydrophobic</type>  
  10.     </molecule>  
  11.     <molecule>  
  12.         <name>Lysine</name>  
  13.         <symbol>lys</symbol>  
  14.         <code>K</code>  
  15.         <type>charged</type>  
  16.     </molecule>  
  17. </moldb>  
  18. XML;  
  19.   
  20. $parse = xml_parser_create();  
  21. xml_parser_set_option($parse, XML_OPTION_CASE_FOLDING, 1);  
  22. xml_parser_set_option($parse, XML_OPTION_SKIP_WHITE, 1);  
  23. $val = array();  
  24. $index = array();  
  25. xml_parse_into_struct($parse$xml$val$index);  
  26. echo "<pre>";  
  27. print_r($val);  
  28. echo "<br />";  
  29. print_r($index);  
  30. echo "</pre>";  
  31. ?>  

解析结果

[html]

  1. Array  
  2. (  
  3.     [0] => Array  
  4.         (  
  5.             [tag] => MOLDB  
  6.             [type] => open  
  7.             [level] => 1  
  8.         )  
  9.   
  10.     [1] => Array  
  11.         (  
  12.             [tag] => MOLECULE  
  13.             [type] => open  
  14.             [level] => 2  
  15.         )  
  16.   
  17.     [2] => Array  
  18.         (  
  19.             [tag] => NAME  
  20.             [type] => complete  
  21.             [level] => 3  
  22.             [value] => Alanine  
  23.         )  
  24.   
  25.     [3] => Array  
  26.         (  
  27.             [tag] => SYMBOL  
  28.             [type] => complete  
  29.             [level] => 3  
  30.             [value] => ala  
  31.         )  
  32.   
  33.     [4] => Array  
  34.         (  
  35.             [tag] => CODE  
  36.             [type] => complete  
  37.             [level] => 3  
  38.             [value] => A  
  39.         )  
  40.   
  41.     [5] => Array  
  42.         (  
  43.             [tag] => TYPE  
  44.             [type] => complete  
  45.             [level] => 3  
  46.             [value] => hydrophobic  
  47.         )  
  48.   
  49.     [6] => Array  
  50.         (  
  51.             [tag] => MOLECULE  
  52.             [type] => close  
  53.             [level] => 2  
  54.         )  
  55.   
  56.     [7] => Array  
  57.         (  
  58.             [tag] => MOLECULE  
  59.             [type] => open  
  60.             [level] => 2  
  61.         )  
  62.   
  63.     [8] => Array  
  64.         (  
  65.             [tag] => NAME  
  66.             [type] => complete  
  67.             [level] => 3  
  68.             [value] => Lysine  
  69.         )  
  70.   
  71.     [9] => Array  
  72.         (  
  73.             [tag] => SYMBOL  
  74.             [type] => complete  
  75.             [level] => 3  
  76.             [value] => lys  
  77.         )  
  78.   
  79.     [10] => Array  
  80.         (  
  81.             [tag] => CODE  
  82.             [type] => complete  
  83.             [level] => 3  
  84.             [value] => K  
  85.         )  
  86.   
  87.     [11] => Array  
  88.         (  
  89.             [tag] => TYPE  
  90.             [type] => complete  
  91.             [level] => 3  
  92.             [value] => charged  
  93.         )  
  94.   
  95.     [12] => Array  
  96.         (  
  97.             [tag] => MOLECULE  
  98.             [type] => close  
  99.             [level] => 2  
  100.         )  
  101.   
  102.     [13] => Array  
  103.         (  
  104.             [tag] => MOLDB  
  105.             [type] => close  
  106.             [level] => 1  
  107.         )  
  108.   
  109. )  
  110.   
  111. Array  
  112. (  
  113.     [MOLDB] => Array  
  114.         (  
  115.             [0] => 0  
  116.             [1] => 13  
  117.         )  
  118.   
  119.     [MOLECULE] => Array  
  120.         (  
  121.             [0] => 1  
  122.             [1] => 6  
  123.             [2] => 7  
  124.             [3] => 12  
  125.         )  
  126.   
  127.     [NAME] => Array  
  128.         (  
  129.             [0] => 2  
  130.             [1] => 8  
  131.         )  
  132.   
  133.     [SYMBOL] => Array  
  134.         (  
  135.             [0] => 3  
  136.             [1] => 9  
  137.         )  
  138.   
  139.     [CODE] => Array  
  140.         (  
  141.             [0] => 4  
  142.             [1] => 10  
  143.         )  
  144.   
  145.     [TYPE] => Array  
  146.         (  
  147.             [0] => 5  
  148.             [1] => 11  
  149.         )  
  150.   
  151. )  


下面对$index索引数组做进一步分析,比如在上面的例子中(<--此处表示的是注释,用语解释说明,表示在解析数组中,他们所处的位置。 同样我们需要获取他们的值得时候,就根据这个索引来取值-->):

[html]

  1. <moldb><--0-->  
  2.     <molecule><--1-->  
  3.         <name>Alanine</name><--2-->  
  4.         <symbol>ala</symbol><--3-->  
  5.         <code>A</code><--4-->  
  6.         <type>hydrophobic</type><--5-->  
  7.     </molecule><--6-->  
  8.     <molecule><--7-->  
  9.         <name>Lysine</name><--8-->  
  10.         <symbol>lys</symbol><--9-->  
  11.         <code>K</code><--10-->  
  12.         <type>charged</type><--11-->  
  13.     </molecule><--12-->  
  14. </moldb><--13-->  


比如上例XML中有2个molecule元素,第一个为molecule{1,6},第2个为molecule{7,12}。 同样有两个name元素,第一个为name{2},第2个为name{8},以此类推。


本文固定链接: http://www.devba.com/index.php/archives/5915.html | 开发吧

报歉!评论已关闭.