32

XML ファイルを DOM ドキュメントにロードしました。すべての 'foo' タグを反復処理して、その下のすべてのタグから値を取得したいと考えています。私は値を取得できることを知っています

$element = $dom->getElementsByTagName('foo')->item(0);
foreach($element->childNodes as $node){
    $data[$node->nodeName] = $node->nodeValue;
}

ただし、私がやろうとしているのは、次のような XML からのものです。

<stuff>
  <foo>
    <bar></bar>
      <value/>
    <pub></pub>
  </foo>
  <foo>
    <bar></bar>
    <pub></pub>
  </foo>
  <foo>
    <bar></bar>
    <pub></pub>
  </foo>
  </stuff>

すべてのfooタグを反復処理し、特定のbarまたはpubを取得し、そこから値を取得します。では、名前で特定の子ノードに引き続きアクセスできるように、fooを反復処理するにはどうすればよいでしょうか?

4

4 に答える 4

45

テストされていませんが、どうですか:

$elements = $dom->getElementsByTagName('foo');
$data = array();
foreach($elements as $node){
    foreach($node->childNodes as $child) {
        $data[] = array($child->nodeName => $child->nodeValue);
    }
}
于 2008-10-10T15:56:45.183 に答える
4

一般に、XPath を使用してドキュメントをクエリする方が、ドキュメントの構造に関する知識に依存するコードを記述するよりもはるかに優れています。理由は 2 つあります。まず、テストおよびデバッグするコードが大幅に少なくなります。第 2 に、ドキュメントの構造が変更された場合、一連のコードを変更するよりも XPath クエリを変更する方がはるかに簡単です。

もちろん、XPath を学ぶ必要がありますが、(ほとんどの) XPath はロケット科学ではありません。

PHP の DOM は、このxpath_evalメソッドを使用して XPath クエリを実行します。ここに文書化されており、ユーザー ノートにはかなり良い例がいくつか含まれています。

于 2008-10-10T20:23:36.923 に答える
2

これを行う別の(怠惰な)方法があります。

$data[][$node->nodeName] = $node->nodeValue;
于 2008-12-09T16:29:40.690 に答える