我正在尝试使用XML :: Simple解析Perl中的一些XML。
XML遵循以下格式:
<result>
<doc>
<field name="title">Sample Title</field>
<field name="content">Content 1</field>
<field name="content">Content 2</field>
.
.
.
<field name="content">Content n</field>
</doc>
</result>
使用XML :: Simple我试图解析它并打印标题和所有内容。问题是只打印了最后一个内容项。我决定使用Dumper,这就是它的回报:
$VAR1= {
'result'=> {
'doc' => [
{
'field' => {
'content' => {
'content' => 'Content n'
},
'title' => {
'content' => 'Sample Title'
}
}
}
仅为每个doc元素显示最后一个内容项。这有什么理由吗?如何让它检测所有内容项?
编辑:这是代码:
my $url = "http://www.testurl.com/test.xml";
my $content = get $url;
die "Couldn't get XML" unless defined $content;
my $xml = new XML::Simple;
my $xmlData = $xml->XMLin($content);
print Dumper($xmlData);
答案 0 :(得分:8)
根据POD:
注1:'KeyAttr'的默认值是['name','key','id']。如果您不想在输入上折叠或在输出上展开,则必须将此选项设置为空列表以禁用该功能。
它将“名称”作为ID类型字段并将元素折叠在一起。
perl -MXML::Simple -MData::Dumper
my $raw = <<XML_SAMPLE;
<result>
<doc>
<field name="title">Sample Title</field>
<field name="content">Content 1</field>
<field name="content">Content 2</field>
.
.
.
<field name="content">Content n</field>
</doc>
</result>
XML_SAMPLE
my $xml = new XML::Simple;
my $xmlData = $xml->XMLin($raw, KeyAttr => []);
print Dumper($xmlData);
__END__
$VAR1 = {
'doc' => {
'content' => '
.
.
.
',
'field' => [
{
'content' => 'Sample Title',
'name' => 'title'
},
{
'content' => 'Content 1',
'name' => 'content'
},
{
'content' => 'Content 2',
'name' => 'content'
},
{
'content' => 'Content n',
'name' => 'content'
}
]
}
};
答案 1 :(得分:1)
use warnings;
use strict;
use XML::Simple;
use Data::Dumper;
$Data::Dumper::Sortkeys=1;
my $str = '
<result>
<doc>
<field name="title">Sample Title</field>
<field name="content">Content 1</field>
<field name="content">Content 2</field>
<field name="content">Content n</field>
</doc>
</result>
';
print Dumper(XMLin($str, KeyAttr => 'content'));
__END__
$VAR1 = {
'doc' => {
'field' => {
'Content 1' => {
'name' => 'content'
},
'Content 2' => {
'name' => 'content'
},
'Content n' => {
'name' => 'content'
},
'Sample Title' => {
'name' => 'title'
}
}
}
};
答案 2 :(得分:0)
XML :: Simple将name视为重复xml元素的唯一标识符。尝试将测试的“名称”属性切换为“标签”。我希望你会看到你期望的翻斗车输出。给我看一下XML :: Fast,我发现它更加一致,更不用说至少快一个数量级了。