2016-03-11 2 views
0

J'utilise perl avec XML :: Simple pour imprimer le contenu d'un fichier XML. La structure du fichier XML m'empêche cependant de répertorier toutes les entrées car je ne trouve pas la bonne façon de faire une boucle sur les tableaux imbriqués. Quelqu'un peut-il m'aider et montrer comment faire cela?Perl XML :: Simple avec des tableaux imbriqués

La structure XML est comme:

<header> 
<rows> 
    <row> 
    <elem>a</elem> 
    <elem>b</elem> 
    <elem>c</elem> 
    </row> 
    <row> 
    <elem>d</elem> 
    <elem>e</elem> 
    <elem>f</elem> 
    </row> 
</rows> 
</header> 

Mon programme est comme ceci:

my $infile = test.xml; 
my $xml = new XML::Simple (KeyAttr=>[]); 
my $main = $xml->XMLin("$infile",SuppressEmpty => ''); 

Je peux imprimer des entrées séparées de élém en utilisant

print "$main->{rows}->{row}->[0]->{elem}[0]\n"; 

et imprimer toutes les entrées de le n-ème élément utilisant

for (@{$main->{rows}{row}}) { 
    print "$_->{elem}[0] \n"; 
} 

Ce imprimerait

a 
d 

Mais comment puis-je imprimer:

a;b;c; 
d;e;f; 

Merci pour toutes les réponses.

Répondre

0
print join ';', @{ $_->{elem} }, "\n"; 
2

Je commencerais par "don't use XML::Simple" - Je aime bien XML::Twig comme agréable et facile à utiliser alternative. (XML::LibXML est bon aussi, mais a un peu plus d'une courbe d'apprentissage):

#!/usr/bin/env perl 
use strict; 
use warnings; 
use XML::Twig; 

my $xml = XML::Twig -> parsefile ($infile); 

foreach my $row ($xml -> get_xpath('//row')) { 
    print join (";", map { $_ -> text } $row -> children('elem')),"\n"; 
} 

Prints:

a;b;c 
d;e;f 

(Déroulant les boucles pour un souci de clarté:

foreach my $row ($xml -> get_xpath('//row')) { 
    foreach my $elem ($row -> children ('elem')) { 
     print $elem -> text, ";"; 
    } 
    print "\n"; 
} 
+0

Merci , a parfaitement fonctionné! – Adiveara