2008-10-10 5 views
28

J'ai un fichier XML chargé dans un document DOM, Je souhaite parcourir tous les tags 'foo', en obtenant des valeurs de chaque balise en dessous. Je sais que je peux obtenir des valeurs viaComment puis-je itérer à travers les éléments DOM en PHP?

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

Cependant, ce que je suis en train de faire, est d'un XML comme,

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

itérer sur tous les tag foo et obtenir bar spécifique ou pub, et obtenir des valeurs à partir de là. Maintenant, comment puis-je itérer sur foo afin que je puisse toujours accéder à des nœuds enfants spécifiques par leur nom?

Répondre

41

Non testé, mais qu'en est-:

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

Pas besoin de $ elementCount. Ajoutez juste $ à des données comme ceci: $ data [] = array ($ child-> nodeName => $ child-> nodeValue); – troelskn

+1

Cela a fait l'affaire! Je pensais trop compliqué. Doit être fatigué. – Esa

+0

Mis à jour le code basé sur le commentaire de troelskn, c'est ce que vous vouliez dire? – roryf

4

Il est généralement préférable d'utiliser XPath pour interroger un document que d'écrire du code qui dépend de la connaissance de la structure du document. Il y a deux raisons. Premièrement, il y a beaucoup moins de code à tester et à déboguer. Deuxièmement, si la structure du document change, il est beaucoup plus facile de modifier une requête XPath que de changer un tas de code.

Bien sûr, vous devez apprendre XPath, mais (la plupart des) XPath n'est pas sorcier.

Le DOM de PHP utilise la méthode xpath_eval pour effectuer des requêtes XPath. Il est documenté here, et les notes de l'utilisateur incluent de très bons exemples.

1

Voici une autre façon (paresseuse) de le faire.

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

Avec FluidXML vous pouvez interroger et itérer XML très facilement.

$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

Questions connexes