PHP nasıl DOM öğeleri boyunca yineleme mi?

3 Cevap php

I have an XML file loaded into a DOM document, I wish to iterate through all 'foo' tags, getting values from every tag below it. I know I can get values via

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

Ancak, ben yapmaya çalışıyorum ne gibi bir XML olduğunu

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

iterate over every foo tag, and get specific bar or pub, and get values from there. Now, how do I iterate over foo so that I can still access specific child nodes by name?

3 Cevap

Test edilmiş, ancak ne değil:

$elements = $dom->getElementsByTagName('foo');
$data = array();
foreach($elements as $node){
    foreach($node->childNodes as $child) {
        $data[] = array($child->nodeName => $child->nodeValue);
    }
}

Bu belgenin yapısının bilinmesine bağlıdır kod yazmak daha bir belge sorgulamak için XPath kullanmak genellikle çok iyidir. Iki nedeni vardır. Öncelikle, test ve hata ayıklama için çok daha az kod var. Belgenin yapısını değiştirirse İkincisi, bu kodun bir demet değiştirmek daha bir XPath sorgusu değiştirmek için çok daha kolay.

Tabii ki, XPath öğrenmek zorunda, ancak XPath (çoğu) roket bilimi değildir.

PHP'nin DOM XPath sorguları gerçekleştirmek için xpath_eval yöntemi kullanır. Bu here belgelenmiş ve kullanıcı notları bazı oldukça iyi örnekler bulunmaktadır ediyor.

$ Veri [] [$ node-> nodeName] = $ node-> nodeValue;

Eğer tembel eğer, bunu yapmak için başka bir yolu