Php Simplexml对象节点迭代
我有一个XML文件,我正在用PHP的Simplexml解析它,但是我在节点迭代中遇到了一个问题 XML:Php Simplexml对象节点迭代,php,xml,iteration,Php,Xml,Iteration,我有一个XML文件,我正在用PHP的Simplexml解析它,但是我在节点迭代中遇到了一个问题 XML: <channel> <item> <title>Title1</title> <category>Cat1</category> </item> <item> <title>Title2</title> <category&
<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>
将打印所有类别名称,但使用
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数据(例如,如果xml数据是由用户生成的内容创建的),则应该考虑这一点。不幸的是,在php中没有类似参数化查询的简单方法
有关php xpath函数文档,请参见此处:
有关xpath参考,请参见此处:对于糟糕的格式设置,我深表歉意。我的手机不太适合编辑。请进行相应的编辑。项目重复了多次,因此应该被迭代,或者被引用为$this->xml->channel->item[0],$this->xml->channel->item[1],等等。实际上,这就是我正在做的。只是打错了。我已经更新了代码。我认为行
$size=count($size)
应该是$size=count($items)代码>,对吗?是的。又一个打字错误。对不起,伙计们,谢谢你们提供的信息。虽然在这种情况下我仍然无法让它工作,但我将在类中的其他方法中使用它。我将用一些更新的调试信息编辑原始帖子。抱歉,我的回答中有一个小错误:xpath表达式中的$categoryName需要用单引号括起来。我刚刚在进行了测试,现在看起来不错。您发布的代码易于XPath注入。由于这是一个与经验不太丰富的程序员相关的问题,如果您建议使用xpath,请不要跳过答案中的这一重要部分。请参阅:它还提供了有关此主题的现有Stackoverflow答案的参考。哇。是的,我不知道XML注入,因为我过去不太需要使用它。谢谢你的代码和参考资料。
private function categoryCount($categoryName) {
$categoryName = $this->sanitize($categoryName); // easy xpath injection protection
return count($this->xml->xpath("//item[category='$categoryName']"));
}
// 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 . "']";