我有以下結構的XML文檔:PHP XML Expat解析器:如何只讀取部分XML文檔?
<posts>
<user id="1222334">
<post>
<message>hello</message>
<client>client</client>
<time>time</time>
</post>
<post>
<message>hello client how can I help?</message>
<client>operator</client>
<time>time</time>
</post>
</user>
<user id="2333343">
<post>
<message>good morning</message>
<client>client</client>
<time>time</time>
</post>
<post>
<message>good morning how can I help?</message>
<client>operator</client>
<time>time</time>
</post>
</user>
</posts>
我能夠創建解析器並打印出整個文檔中,但問題是,我想只打印(用戶)節點和兒童具有特定的屬性(id)。
我的PHP代碼:
if(!empty($_GET['id'])){
$id = $_GET['id'];
$parser=xml_parser_create();
function start($parser,$element_name,$element_attrs)
{
switch($element_name)
{
case "USER": echo "-- User --<br>";
break;
case "CLIENT": echo "Name: ";
break;
case "MESSAGE": echo "Message: ";
break;
case "TIME": echo "Time: ";
break;
case "POST": echo "--Post<br> ";
}
}
function stop($parser,$element_name){ echo "<br>"; }
function char($parser,$data){ echo $data; }
xml_set_element_handler($parser,"start","stop");
xml_set_character_data_handler($parser,"char");
$file = "test.xml";
$fp = fopen($file, "r");
while ($data=fread($fp, filesize($file)))
{
xml_parse($parser,$data,feof($fp)) or
die (sprintf("XML Error: %s at line %d",
xml_error_string(xml_get_error_code($parser)),
xml_get_current_line_number($parser)));
}
xml_parser_free($parser);
}
在start()
功能使用此可以選擇合適的節點,但它並沒有在閱讀過程中有任何影響:
if(($element_name == "USER") && $element_attrs["ID"] && ($element_attrs["ID"] == "$id"))
任何幫助將不勝感激
更新: XMLReader的作品,但使用if語句時,它停止工作:
foreach ($filteredUsers as $user) {
echo "<table border='1'>";
foreach ($user->getChildElements('post') as $index => $post) {
if($post->getChildElements('client') == "operator"){
printf("<tr><td class='blue'>%s</td><td class='grey'>%s</td></tr>", $post->getChildElements('message'), $post->getChildElements('time'));
}else{
printf("<tr><td class='green'>%s</td><td class='grey'>%s</td></tr>", $post->getChildElements('message'), $post->getChildElements('time'));
}
}
echo "</table>";
}
使用['XMLReader'](http://php.net/book.xmlreader)而不是expat解析器可以嗎? – hakre 2013-03-15 17:08:30
我更喜歡使用Expat解析器,它是PHP本地的,可以處理大型XML文件,它也是基於事件的解析器而不是DOM。我發現它非常強大,我特別喜歡'xml_set_element_handler'函數,它可以幫助您輕鬆定義開始和結束標籤。我確定必須有一個選項來閱讀文檔的一部分! – razzak 2013-03-15 17:51:00
'XMLReader'是PHP原生的,可以處理大型XML文件,它是一個XML Pull解析器。閱讀器充當向文檔流前進的光標,並停在路上的每個節點上。而對於Expat:不,沒有這樣的選擇,但對於XMLReader有這個;)這就是爲什麼我問。 – hakre 2013-03-15 17:55:31