Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Simplexml对象节点迭代_Php_Xml_Iteration - Fatal编程技术网

Php Simplexml对象节点迭代

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&

我有一个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>
将打印所有类别名称,但使用

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 . "']";