2013-10-19 160 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