it-swarm.dev

Jak mohu iterovat prostřednictvím prvků DOM v PHP?

Mám soubor XML načten do dokumentu DOM, chci iterovat prostřednictvím všech značek „foo“ a získávat hodnoty z každé značky pod ním. Vím, že mohu získat hodnoty přes

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

Co se ale snažím udělat, je z XML,

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

iterovat přes každý foo tag, a získat specifické bar nebo pub , a získat hodnoty odtamtud. Jak mohu iterovat přes foo tak, že stále mohu přistupovat ke konkrétním dětským uzlům podle jména?

29
Esa

Není testováno, ale co:

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

Obecně je mnohem lepší použít XPath pro dotazování dokumentu, než pro zápis kódu, který závisí na znalostech struktury dokumentu. Existují dva důvody. Za prvé, je mnohem méně kódu pro testování a ladění. Za druhé, pokud se změní struktura dokumentu, je mnohem snazší změnit dotaz XPath, než změnit spoustu kódu.

Samozřejmě, musíte se naučit XPath, ale (většinou) XPath není raketová věda.

DOM DOM PHP používá metodu xpath_eval k provádění dotazů XPath. Je to zdokumentováno zde , a uživatelské poznámky obsahují některé docela dobré příklady.

4
Robert Rossney

Zde je další (líný) způsob, jak to udělat.

$data[][$node->nodeName] = $node->nodeValue;
1

S FluidXML můžete dotazovat a iterovat XML velmi snadno.

$data = [];

$store_child = function($i, $fooChild) use (&$data) {
    $data[] = [ $fooChild->nodeName => $fooChild->nodeValue ];
};

fluidxml($dom)->query('//foo/*')->each($store_child);

https://github.com/servo-php/fluidxml

0
Daniele Orlando