<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
д»Јжӣҝexpatи§ЈжһҗеҷЁпјҢиҝҷж ·еҸҜиЎҢеҗ—пјҹ - hakrexml_set_element_handler
函数,它可以帮助轻松定义开始和结束标签。我相信一定有读取文档部分的选项! - razzXMLReader
是 PHP 原生支持的,可以处理大型 XML 文件,它是一种 XML Pull 解析器。该阅读器充当游标,在文档流上向前移动并在途中停留在每个节点上。至于 Expat:没有这样的选项,但对于 XMLReader 是有的;这就是我为什么在问的原因。 - hakreXMLReader
将非常好,如果您能向我展示如何使用它来解决我的问题,我将不胜感激 :) - razz