在perl中解析xml产生的输出格式与我预期的不同
我对perl非常陌生。我正在尝试使用PerlXML解析模块xml::Simple解析xml文件。 下面是我试图解析的示例xml:在perl中解析xml产生的输出格式与我预期的不同,xml,perl,parsing,Xml,Perl,Parsing,我对perl非常陌生。我正在尝试使用PerlXML解析模块xml::Simple解析xml文件。 下面是我试图解析的示例xml: <?xml version="1.0" encoding="US-ASCII"?> <book> <key>ISBN1</key> <str>name1</str> <key>ISBN2</key> <str>name2</
<?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>
输出为:
$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格式似乎与PerlXML解析器所期望的格式不同。有人能帮我找到一个更好的方法来获得预期的产出吗
提前感谢。使用哈希片将数据转换为所需格式
my %name_by_isbn;
@name_by_isbn{ @{ $data->{key} } } = @{ $data->{str} };
请不要使用。这是令人沮丧的
#!/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'
};
或无温度变量的所有压缩(这可能是或可能不是一种改进):
虽然我建议您的源XML的结构很糟糕—如果“key”和“str”匹配,它们应该在同一个元素中,因为这就是元素的用途。如果你能控制它,我可以建议:
<?xml version="1.0" encoding="US-ASCII"?>
<books>
<book key="ISBN1" name="name1" />
</books>
From
您确实不想在新代码中使用此模块。如果忽略此警告并使用它,qw(:strict)模式将为您省去一点麻烦。
XML::LibXML
和XML::Twig
建议作为替代方法。谢谢Sobrique。成功了。你是对的,我试图解析的Xml格式不好。我得到了等价的json文件,可以用我期望的格式进行解析。
my %data;
@data{ map { $_->text } $twig->get_xpath('//key') } =
map { $_->text } $twig->get_xpath('//str');
print Dumper \%data;
<?xml version="1.0" encoding="US-ASCII"?>
<books>
<book key="ISBN1" name="name1" />
</books>