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 數組中對應值的指針。最後兩個數組參數可由指針傳遞給函式。
以下範例顯示了由該函式生成的數組的內部結構。我們簡單地將一個 note 嵌入到一個 para 標記中,解析後我們可以列印出生成的數組的結構:
<?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 arrayArray( [PARA] => Array ( [0] => 0 [1] => 2 ) [NOTE] => Array ( [0] => 1 ))Vals arrayArray( [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
以下是解析該文檔並生成相應對象的代碼:
2. parsemoldb.php - 將 moldb.xml 解析到分子(molecular)對象的數組中 <?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 )) |