2

PHP の Simplexml を使用して解析している XML ファイルがありますが、ノードの繰り返しで問題が発生しています。

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;
    }
}

倍増したカテゴリのインスタンスを 1 つだけ出力します。行をコピーして貼り付けても、1つしか表示されません。これは、XML 構造が無効である可能性があることを意味しますか?

4

1 に答える 1

1

XML ファイル内の特定の名前を持つ要素をカウントする簡単な方法は、xpath を使用することです。これを試して:

private function categoryCount($categoryName) {
    $categoryName = $this->sanitize($categoryName); // easy xpath injection protection
    return count($this->xml->xpath("//item[category='$categoryName']"));
}

$categoryNamexpath インジェクションを防ぐために、sanitize() 関数は、一重引用符と二重引用符を削除する必要があります。引用符を含むカテゴリ名のクエリも機能させるには、一重引用符または二重引用符が含まれているかどうかに応じて、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 xpath 関数のドキュメントについては、こちらを参照してください: http://php.net/manual/en/simplexmlelement.xpath.php

xpath リファレンスについては、 http ://www.w3schools.com/xpath/xpath_syntax.asp を参照してください。

于 2013-10-19T22:30:22.700 に答える