2008-10-10 24 views
28

Tengo un archivo XML cargado en un documento DOM, Deseo repetir todas las etiquetas 'foo', obteniendo valores de cada etiqueta debajo de él. Sé que puedo obtener los valores a través de¿Cómo puedo iterar a través de elementos DOM en PHP?

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

Sin embargo, lo que estoy tratando de hacer, es a partir de un XML como,

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

iterar sobre cada etiquetafoo, y obtener específica bar o pub, y obtén valores de allí. Ahora, ¿cómo puedo iterar sobre foo para poder acceder a nodos secundarios específicos por nombre?

Respuesta

41

No se ha probado, pero ¿qué pasa:

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

No hay necesidad de $ elementCount. Simplemente agregue $ a datos como este: $ data [] = array ($ child-> nodeName => $ child-> nodeValue); – troelskn

+1

¡Eso hizo el truco! Estaba pensando demasiado complicado. Debe estar cansado. – Esa

+0

Actualizado el código basado en el comentario de troelskn, ¿es eso lo que quiso decir? – roryf

4

Por lo general es mucho mejor utilizar XPath para consultar un documento de lo que es escribir código que depende del conocimiento de la estructura del documento. Hay dos razones En primer lugar, hay mucho menos código para probar y depurar. En segundo lugar, si la estructura del documento cambia, es mucho más fácil cambiar una consulta XPath que cambiar una gran cantidad de código.

Por supuesto, tienes que aprender XPath, pero (la mayoría de) XPath no es ciencia espacial.

DOM de PHP utiliza el método xpath_eval para realizar consultas XPath. Está documentado here, y las notas del usuario incluyen algunos ejemplos bastante buenos.

1

Aquí hay otra forma (floja) de hacerlo.

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

Con FluidXML puede consultar e iterar XML muy fácilmente.

$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

Cuestiones relacionadas