2016-07-18 2 views
1

Ich bin sehr neu in Perl. Ich versuche, eine XML-Datei mit Perl XML-Analysemodul XML :: Simple zu analysieren. Im Folgenden finden Sie die Probe xml ich zu analysieren versuchen:Parsing XML in Perl produzieren Ausgabe in einem anderen Format als ich erwartet

<?xml version="1.0" encoding="US-ASCII"?> 
<book> 
    <key>ISBN1</key> 
    <str>name1</str> 
    <key>ISBN2</key> 
    <str>name2</str> 
    <key>ISBN3</key> 
    <str>name3</str> 
    <key>ISBN4</key> 
    <str>name4</str> 
    <key>ISBN5</key> 
    <str>name5</str> 
    <key>ISBN6</key> 
    <str>name6</str> 
</book> 

Below Perl-Programm, das ich die analysierte Ausgabe zu analysieren und Dump bin mit:

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

Und der Ausgang ist:

$VAR1 = { 
      'str' => [ 
        'name1', 
        'name2', 
        'name3', 
        'name4', 
        'name5', 
        'name6' 
       ], 
      'key' => [ 
        'ISBN1', 
        'ISBN2', 
        'ISBN3', 
        'ISBN4', 
        'ISBN5', 
        'ISBN6' 
       ] 
     }; 

Aber ich brauche es in folgendem Format analysiert werden:

$VAR1 = { 
      'ISBN1' => 'name1', 
      'ISBN2' => 'name2', 
      'ISBN3' => 'name3', 
      'ISBN4' => 'name4', 
      'ISBN5' => 'name5', 
      'ISBN6' => 'name6', 
}; 

Es scheint, dass meine XML in einem anderen Format ist als das, was Perl Xml Parser erwartet. Könnte mir jemand helfen, einen besseren Ansatz zu finden, um die erwartete Leistung zu erhalten?

Vielen Dank im Voraus.

+1

Von http://search.cpan.org/~grantm/XML-Simple-2.22/lib/XML/Simple.pm 'Sie wirklich don‘ Ich möchte dieses Modul in neuem Code verwenden. Wenn Sie diese Warnung ignorieren und trotzdem verwenden, wird der qw (: strict) -Modus Ihnen ein wenig Schmerzen ersparen. – xxfelixxx

+0

'XML :: LibXML' http://search.cpan.org/~shlomif/XML-LibXML-2.0126 Als Alternativen werden /LibXML.pod und 'XML :: Twig' http://search.cpan.org/~mirod/XML-Twig-3.49/Twig.pm vorgeschlagen. – xxfelixxx

Antwort

2

Bitte bitte bitte - nicht verwenden XML::Simple. Es ist entmutigt.

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

my $twig = XML::Twig -> new -> parsefile($fuseMap); 

my %data; 

my @keys = map { $_ -> text } $twig -> get_xpath('//key'); 
my @strs = map { $_ -> text } $twig -> get_xpath('//str'); 

@data{@keys} = @strs; 

print Dumper \%data; 

Welche Ausgänge:

$VAR1 = { 
      'ISBN2' => 'name2', 
      'ISBN6' => 'name6', 
      'ISBN3' => 'name3', 
      'ISBN5' => 'name5', 
      'ISBN1' => 'name1', 
      'ISBN4' => 'name4' 
     }; 

Oder alle ohne Temperatur Vars komprimiert (was kann oder auch nicht eine Verbesserung sein):

my %data; 
@data{ map { $_->text } $twig->get_xpath('//key') } = 
      map { $_->text } $twig->get_xpath('//str'); 
print Dumper \%data; 

Obwohl ich Ihre XML-Quell vorschlagen würde, ist schlecht structured - wenn 'key' und 'str' übereinstimmen, sollten sie sich innerhalb des gleichen Elements befinden, denn das sind die Elemente für. Wenn Sie irgendeine Kontrolle darüber haben, kann ich vorschlagen:

<?xml version="1.0" encoding="US-ASCII"?> 
<books> 
    <book key="ISBN1" name="name1" /> 
</books> 
+0

Danke Sobrique. Es funktionierte. Du hast Recht, das Xml, das ich analysieren möchte, ist nicht in einem guten Format. Ich habe gleichwertige JSON-Datei, die in dem Format analysiert werden kann, das ich erwarte. – sands1988

0

Konvertieren Sie die Daten mit einem Hash-Slice in das gewünschte Format.

my %name_by_isbn; 
@name_by_isbn{ @{ $data->{key} } } = @{ $data->{str} };