2014-05-12 4 views
0

J'ai ce fichier XML, j'ai besoin d'obtenir les catégories, les propriétés et les cas de test, J'ai réussi à le faire en utilisant XML :: LibXML et findnodes Le problème est parfois la structure est différente, donc il peut y avoir plus de nœuds de résultats que le nœud dans les findnodes n'est pas correct.Perl parse xml avec XML :: noeud dynamique LibXML

Alors, quelle est la meilleure façon de le gérer? Je ne sais pas comment rechercher type = "Fixture (ce qui est le nœud qui a l'info j'ai besoin) si je ne sais pas le noeud de départ de base correcte.

<test-A> 
<test-suite type="Project"> 
    <results> 
     <test-suite type="Setup"> 
      <results> 
      <test-suite type="Fixture> 
       <categories> 
       <category name="AAA" /> 
       <category name="BBB" /> 
       </categories> 
       <properties> 
       <property name="CCC" /> 
       <property name="DDD" /> 
       </properties> 
       <results> 
       <test-case name="EEE" /> 
       <test-case name="DDD" /> 
       </results> 
      </test-suite> 
      </results> 
     </test-suite> 
    </results> 
    </test-suite> 
</test-A> 
+0

Pourriez-vous nous montrer l'expression XPath que vous utilisez actuellement pour trouver l'élément requis? Il semble que 'test-suite [type =" Fixture "]' devrait faire l'affaire, mais je pense qu'il y a d'autres exigences que vous ne spécifiez pas dans la question. – amon

+0

essayé plusieurs: '*/test-suite [type = "Fixture"]' 'test-suite [type = "Fixture"]' plus ... – Epligam

Répondre

0

Jetez un oeil à XPath Examples pour une rapide . conseils sur la façon de créer XPath

afin de préciser que vous voulez un attribut spécifique, ne pas oublier le symbole @. //test-suite[@type="Fixture"] en outre, votre XML actuel manque un devis de fermeture après "Fixture que je vais supposer est une erreur copier/coller

use strict; 
use warnings; 

use XML::LibXML; 

my $dom = XML::LibXML->load_xml({IO => \*DATA}); 

for my $node ($dom->findnodes('//test-suite[@type="Fixture"]')) { 
    print $node, "\n"; 
} 


__DATA__ 
<test-A> 
    <test-suite type="Project"> 
    <results> 
     <test-suite type="Setup"> 
      <results> 
      <test-suite type="Fixture"> 
       <categories> 
       <category name="AAA" /> 
       <category name="BBB" /> 
       </categories> 
       <properties> 
       <property name="CCC" /> 
       <property name="DDD" /> 
       </properties> 
       <results> 
       <test-case name="EEE" /> 
       <test-case name="DDD" /> 
       </results> 
      </test-suite> 
      </results> 
     </test-suite> 
    </results> 
    </test-suite> 
</test-A> 
+0

merci, que l'expression XPath a travaillé pour moi (j'ai oublié le symbole @) – Epligam