2016-07-18 5 views
1

私はperlの新機能です。私はperl xml parsingモジュールXML :: Simpleを使ってxmlファイルを解析しようとしています。以下 は、私が解析しようとしているサンプルXMLです:perlでxmlを解析すると、期待したフォーマットと異なるフォーマットで出力されます

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

、出力は次のとおりです:

以下
<?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> 

は、私が解析された出力を解析し、ダンプに使用していますperlのプログラムがある

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

しかし、以下の形式で解析する必要があります。

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

私のXMLは、perl xml parserが期待するものとは異なるフォーマットであるようです。期待される成果を得るためのより良いアプローチを見つけるのを助けることができるでしょうか?

ありがとうございました。

+1

http://search.cpan.org/~grantm/XML-Simple-2.22/lib/XML/Simple.pm 'あなたは本当にドン」からこのモジュールを新しいコードで使用したい。とにかくこの警告を無視して使用すると、qw(:strict)モードは少しの苦痛を軽減します。 ' – xxfelixxx

+0

'XML :: LibXML' http://search.cpan.org/~shlomif/XML-LibXML-2.0126 /LibXML.podと 'XML :: Twig' http://search.cpan.org/~mirod/XML-Twig-3.49/Twig.pmが選択肢として提案されています。 – xxfelixxx

答えて

2

お願いします。XML::Simpleを使用しないでください。それは落胆します。

出力
#!/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; 

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

またはすべての(またはしないことがあり改善することができる)一時VARSなく圧縮を:

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

私はあなたのソースXMLがひどくている示唆しているが、構造化されていれば、 'key'と 'str'が一致する場合、同じ要素内にあるはずです。の要素はです。あなたはそれ以上の任意のコントロールを持っている場合は、私がお勧めすることができます:

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

ありがとうSobrique。出来た。あなたは、私が解析しようとしているXmlが良いフォーマットではないということは間違いありません。私は期待している形式で解析できる同等のjsonファイルを持っています。 – sands1988

0

ハッシュスライスを使用してデータを目的のフォーマットに変換します。

my %name_by_isbn; 
@name_by_isbn{ @{ $data->{key} } } = @{ $data->{str} }; 
関連する問題