我有一个XML文件,我正在使用PHP的Simplexml进行解析,但是我在通过节点进行迭代时遇到了问题。
该 XML:
<channel>
<item>
<title>Title1</title>
<category>Cat1</category>
</item>
<item>
<title>Title2</title>
<category>Cat1</category>
</item>
<item>
<title>Title3</title>
<category>Cat2</category>
</item>
</channel>
我的计数功能:
public function cat_count($cat) {
$count = 0;
$items = $this->xml->channel->item;
$size = count($items);
for ($i=0; $i<$size; $i++) {
if ($items[$i]->category == $cat) {
$count++;
}
}
return $count;
}
我是否忽略了代码中的错误,或者是否有另一种首选方法来遍历节点?我也用过一个foreach和while语句,但没有运气,所以我不知所措。有什么建议吗?
编辑:在使用下面的xpath方法时,我注意到使用
foreach ($this->xml->channel->item as $item) {
echo $item->category;
}
将打印所有类别名称,但是,使用
foreach ($this->xml->channel->item as $item) {
if ($item->category == $cat) {
echo $item->category;
}
}
将仅打印双倍类别的一个实例。即使我复制并粘贴了这些行,也只显示一条。这是否意味着 XML 结构可能以某种方式无效?
在 XML 文件中计算具有给定名称的元素的一种简单方法是使用 xpath。试试这个:
private function categoryCount($categoryName) {
$categoryName = $this->sanitize($categoryName); // easy xpath injection protection
return count($this->xml->xpath("//item[category='$categoryName']"));
}
sanitize() 函数应该删除$categoryName
中的单引号和双引号,以防止 xpath 注入。若要使对包含引号的类别名称的查询也起作用,您需要根据包含单引号或双引号的顺序构建 xpath 查询字符串:
// xpath in case of single quotes in category name
$xpath = '//item[category="' . $categoryName . '"]';
// xpath in case of double quotes in category name
$xpath = "//item[category='" . $categoryName . "']";
如果您无法完全控制 xml 数据(例如,如果根据用户生成的内容创建),则应考虑这一点。不幸的是,在 php 中没有像参数化查询那样简单的方法。
有关 PHP XPaAth函数文档,请参阅此处:http://php.net/manual/en/simplexmlelement.xpath.php
有关 XPath 参考,请参阅此处:http://www.w3schools.com/xpath/xpath_syntax.asp