2016-05-09 12 views
5

Ho un file DEMO.xml simile a questo.XML :: Semplice in perl, con file xml misto

<?xml version="1.0"?> 
<data> 
<pattern>123456</pattern> 
<pattern>654321</pattern> 
<pattern>abcdefg</pattern> 
<pattern owners="alex">heloworld</pattern> 
<pattern owners="alex">perlprogramming</pattern> 
</data> 

Questo è il mio codice Perl per analizzare questo file:

use XML::Simple; 
use strict; 
use Data::Dumper; 

my $xml = new XML::Simple; 
my $data = $xml->XMLin("DEMO.xml"); 
print Dumper($data); 

e qui è quello che ho ottenuto:

$VAR1 = { 
      'pattern' => [ 
         '123456', 
         '654321', 
         'abcdefg', 
         { 
         'owners' => 'alex', 
         'content' => 'heloworld' 
         }, 
         { 
         'owners' => 'alex', 
         'content' => 'perlprogramming' 
         } 
        ] 
     }; 

si può sapere se ho semplicemente stampare il contenuto di tag xml, cosa dovrei fare?

Il risultato atteso potrebbe essere simile:

123456 
654321 
acdefg 
heloworld 
perlprogramming 

Grazie mille!

Alex

risposta

7

Regola uno di utilizzare XML::Simple: Don't, use something else.

mi piace XML::Twig e il problema si presenta così:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Twig; 

my $twig = XML::Twig -> new -> parsefile('DEMO.xml'); 
foreach my $pattern ($twig -> get_xpath ('//pattern')) { 
    print $pattern -> text,"\n"; 
} 
+0

Grazie mille – AlexPham

2

Già. Non utilizzare XML :: Simple.

Lo farei con XML :: LibXML e un po 'di XPath.

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

use XML::LibXML; 

my $parser = XML::LibXML->new(); 
my $doc = $parser->parse_file(shift); 

print $doc->findvalue('//text()'); 

che fa questo:

$ perl xml2text test.xml 

123456 
654321 
abcdefg 
heloworld 
perlprogramming