在perl中解析xml以不同的格式生成输出

时间:2016-07-18 05:15:38

标签: xml perl parsing

我对perl很新。我试图使用perl xml解析模块XML :: Simple解析xml文件。 下面是我试图解析的示例xml:

<?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程序:

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

输出是:

$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解析器所期望的格式不同。有人可以帮我找到更好的方法来获得预期的输出吗?

先谢谢。

2 个答案:

答案 0 :(得分: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'
        };

或者所有没有临时变量的压缩(可能是也可能不是改进):

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

虽然我建议您的源XML格式错误 - 如果&#39;键&#39;和&#39; str&#39;匹配时,它们应该在同一个元素中,因为 。如果你对它有任何控制权,我可以建议:

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

答案 1 :(得分:0)

使用哈希切片将数据转换为所需格式。

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