|
xml_parse_into_struct (PHP 3 >= 3.0.8, PHP 4, PHP 5) xml_parse_into_struct -- 將 XML 資料解析到陣列中 說明int xml_parse_into_struct ( resource parser, string data, array &values [, array &index] )
該函數將 XML 檔案解析到兩個對應的陣列中,index
參數含有指向 values
陣列中對應值的指標。最後兩個陣列參數可由指標傳遞給函數。
注:
xml_parse_into_struct() 失敗返回 0,成功返回
1。這和 FALSE 與
TRUE 不同,使用例如 === 的運算符時要注意。
以下範例顯示了由該函數建立的陣列的內定結構。我們簡單地將一個
note 內嵌到一個 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 文件很複雜,基於該文件的事件處理(Event-driven)解析(基於 expat 增加庫)也會對應的變得複雜。該函數建立的並非 DOM 風格的對象,而是橫印的樹狀結構。因此,我們能夠方便的建立表達 XML 檔案資料的對象。我們假設以下 XML 檔案表示一個關於氨基酸訊息的小型資料庫:
例子 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> |
|
以下是解析該文件並建立相應對象的代碼:
例子 3.
parsemoldb.php - 將 moldb.xml 解析到分子(molecular)對象的陣列中
<?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) { // 讀取 aminoacids 的 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);
// 遍歷 XML 結構 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 物件組成的陣列,該腳本的輸出如下:
| |