7

さて、私はここで私が理解できない奇妙なケースがあります。

ウェブサイトのリストを解析したい。HTMLは次のようになります。

<!-- ... -->
<ul id="foo">
    <li data-text="item 1">Blabla</li>
    <li data-text="item 2">Blabla</li>
    <li data-text="item 3">Blabla</li>
    <li data-text="item 4">Blabla</li>
</ul>
<!-- ... -->

今度はすべてのリストアイテムを取得したいと思います。そのためにDOMDocumentクラスを使用します。これまでのところ、それはうまくいきます:

$dom = new DOMDocument();

if (!$dom->loadHTML($html)) {
    die ('Could not parse...');
}

$list = $dom->getElementById('foo');
$items = $list->childNodes;
foreach ($items as $item) {
     print_r($item);
}

しかし今、私はdata-text属性を読み取るための簡単な方法を探しています。私がしたことは:

foreach ($items as $item) {
     echo $item->getAttribute('data-text');
}

これは最初の項目では問題なく機能しますが、その後foreachループがクラッシュします。出力は次のとおりです。

項目1
致命的なエラー:44行目のexample.phpで未定義のメソッドDOMText :: getAttribute()を呼び出す

ここで得られないのは、getAttributeメソッドを呼び出すとforeachループのコンテキストがどのように変わるかです。したがって、ここに2つの質問があります。

  1. メソッドを呼び出すと、foreachループが台無しになりますか?第二に、最もエレガントな回避策は何ですか?
  2. $item->attributes withさらに別のforeachメソッドをループして、属性名を比較しdata-text、一致する場合は値を読み取ることができることに気付きましたが、それを行うためのより良い方法が必要ですか?!
4

1 に答える 1

8

問題は、ul子としてテキストノードがあり、lisテキストノードには属性がないため、エラーが発生することです。属性にアクセスする前に、子が要素ノードであるかどうかをテストするだけです

foreach ($items as $item) {
         if ($item->nodeType == XML_ELEMENT_NODE)
         echo $item->getAttribute('data-text');
}

を使用することもできgetElementsByTagName()ますが、ネストされたリストがある場合はli、それらのリスト内のsも選択されます。

$items = $list->getElementsByTagName('li');
foreach ($items as $item) {
    echo $item->getAttribute('data-text');
}
于 2013-01-28T22:02:20.990 に答える