2009-11-17 4 views
0

je dois retirer tous les éléments « NODEGROUP » à partir d'un fichier XML:BeautifulSoup.findAll() en Perl

<Database> 
    <Get> 
    <Data> 
     <NodeGroups> 
     <NodeGroup> 
      <AssociateNode ConnID="6748763_2" /> 
      <AssociateNode ConnID="6748763_1" /> 
      <Data DataType="Capacity">2</Data> 
      <Name>Alpha</Name> 
     </NodeGroup> 
     <NodeGroup> 
      <AssociateNode ConnID="6748763_23" /> 
      <AssociateNode ConnID="6748763_7" /> 
      <Data DataType="Capacity">2</Data> 
      <Name>Charlie</Name> 
     </NodeGroup> 
     <NodeGroup> 
      <AssociateNode ConnID="6748763_98" /> 
      <AssociateNode ConnID="6748763_12" /> 
      <Data DataType="Capacity">2</Data> 
      <Name>Papa</Name> 
     </NodeGroup> 
     <NodeGroup> 
      <AssociateNode ConnID="6748763_8" /> 
      <AssociateNode ConnID="6748763_45" /> 
      <Data DataType="Capacity">2</Data> 
      <Name>Yankee</Name> 
     </NodeGroup> 
     </NodeGroups> 
     <System> 
     ... 
     </System> 
    </Data> 
    </Get> 
</Database> 

Si je pouvais utiliser python et BeautifulSoup, j'analyser le xml et appel quelque chose comme:

node_group_array = soup.findAll("nodegroups") 

Mais je suis en utilisant des modules XML de Perl et Perl, donc je XML :: simple marche de XMLIN, récursive dans chaque clé de hachage, vérifier si la valeur est un hachage, de vérifier si elle était " NodeGroup "hash, etc.

Je pense qu'il y a quelque chose comme soup.findAll() dans l'un des modules XML de Perl, mais je ne le trouve pas. Comment faire "soup.findAll ('nodegroups')" en Perl?

Répondre

3

Pour clarifier la réponse de Randal un peu, je pense que vous voulez que le fourni par la distribution XML::LibXML API XML::LibXML::XPathContext:

my $xpath = XML::LibXML::XPathContext->new($document); 
for my $node ($xpath->find('//NodeGroup') { ... } 
1

Il n'y a pas de module "XML" en Perl. Il existe plusieurs modules dans l'espace de noms XML::. Mon préféré est XML::LibXML, mais pour quelque chose d'aussi simple, vous pouvez même utiliser HTML::Parser en "mode xml".

+0

merci pour les heads up, j'ai corrigé mon libellé dans la question – aaronstacy

1

XML :: DOM a getElementsByTagName (pour XML :: faire LibXML :: DOM et XML: : GDOME) qui fonctionne comme la fonction DOM du même nom.

1

En utilisant XML::Simple avec le fichier de données montré:

#!/usr/bin/perl 

use strict; use warnings; 

use XML::Simple; 

my $db = XMLin($ARGV[0]); 
my $nodegroups = $db->{Get}{Data}{NodeGroups}{NodeGroup}; 

use Data::Dumper; 
print Dumper $nodegroups; 

Vous pouvez utiliser l'option ForceArray => 1 pour garantir la cohérence dans le cas où vous avez des fichiers avec plusieurs sections <NodeGroups>...</NodeGroups> et d'autres avec une seule telle section.

Si les fichiers ne sont pas trop volumineux, l'utilisation de XML::Simple devrait fonctionner correctement. Voir aussi la section caveats dans la documentation.

+0

argh, non ce n'est pas un travail pour XML :: Simple. – singingfish

+0

L'OP essayait d'utiliser 'XML :: Simple', donc j'ai montré comment il pouvait être utilisé. Dans le code ci-dessus, '$ nodegroups' est une référence au tableau de' NodeGroup's. –

+0

c'est exactement un travail pour XML :: Simple – user237419