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