xml_parse_into_struct

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 標記中,解析後我們可以列印出生成的數組的結構:

實例1
<?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( &#91;PARA&#93; => Array ( &#91;0&#93; => 0 &#91;1&#93; => 2 ) &#91;NOTE&#93; => Array ( &#91;0&#93; => 1 ))Vals arrayArray( &#91;0&#93; => Array ( &#91;tag&#93; => PARA &#91;type&#93; => open &#91;level&#93; => 1 ) &#91;1&#93; => Array ( &#91;tag&#93; => NOTE &#91;type&#93; => complete &#91;level&#93; => 2 &#91;value&#93; => simple note ) &#91;2&#93; => Array ( &#91;tag&#93; => PARA &#91;type&#93; => close &#91;level&#93; => 1 ) )

如果您的 XML 文檔很複雜,基於該文檔的事件處理(Event-driven)解析(基於 expat 擴展庫)也會對應的變得複雜。該函式生成的並非 DOM 風格的對象,而是橫向的樹狀結構。因此,我們能夠方便的建立表達 XML 檔案數據的對象。我們假設以下 XML 檔案表示一個關於胺基酸信息的小型資料庫:實例2
1. 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>

以下是解析該文檔並生成相應對象的代碼:
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&#91;$k&#93;;
}
}
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&#91;$i&#93; + 1;
$len = $molranges&#91;$i + 1&#93; - $offset;
$tdb&#91;&#93; = parseMol(array_slice($values, $offset, $len));
}
} else {
continue;
}
}
return $tdb;
}
function parseMol($mvalues) {
for ($i=0; $i < count($mvalues); $i++)
$mol&#91;$mvalues&#91;$i&#93;&#91;"tag"&#93;&#93; = $mvalues&#91;$i&#93;&#91;"value"&#93;;
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( &#91;0&#93; => aminoacid Object ( &#91;name&#93; => Alanine &#91;symbol&#93; => ala &#91;code&#93; => A &#91;type&#93; => hydrophobic ) &#91;1&#93; => aminoacid Object ( &#91;name&#93; => Lysine &#91;symbol&#93; => lys &#91;code&#93; => K &#91;type&#93; => charged ))

相關詞條

熱門詞條

聯絡我們