2013-10-19 62 views
2

我有一个XML文件,我用PHP的Simplexml解析,但我有一个问题,通过节点迭代。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结构可能无效?

+0

对不起,可怕的格式。我的手机在编辑器上播放不好。请相应编辑。 – MorbidWrath

+0

项目重复多次,所以应该迭代或引用为$ this-> xml-> channel-> item [0],$ this-> xml-> channel-> item [1]等 –

+0

这就是实际上,我在做。只是输错了它。我更新了代码。 – MorbidWrath

回答

1

一个简单的方法来计算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查询字符串取决于wheather它包含单或双引号:

// 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 XPath函数文档:http://php.net/manual/en/simplexmlelement.xpath.php

在这里看到的XPath参考:http://www.w3schools.com/xpath/xpath_syntax.asp

+0

感谢您的信息。虽然在这种情况下我仍然无法工作,但我会在课堂上以其他方式使用它。我即将编辑原始帖子,并更新一些调试信息。 – MorbidWrath

+0

对不起,我的答案中有一个小错误:xpath表达式中的$ categoryName需要用单引号引起来。我在http://writecodeonline.com/php/上测试过,现在看起来不错。 –

+1

您发布的代码很容易导致XPath注入。由于这是一个与经验不足的程序员有关的问题,如果您建议使用xpath,请不要在答案中跳过这个重要的部分。请参阅:[*缓解PHP *中的XPath注入攻击](http://hakre.wordpress.com/2013/07/11/mitigating-xpath-injection-attacks-in-php/),它也提供对现有Stackoverflow答案的引用关于这个话题。 – hakre