我尝试使用XML :: Simple perl解析来解析xml文档。 我注意到,如果文件看起来像:
<?xml version="1.0" encoding="UTF-8"?>
<fields>
<field>
<f1>1234</f1>
<name>MyName1</name>
</field>
</fields>
打印结果(Dumper($ ref));看起来像预期的那样:
$VAR1 = {
'field' => {
'f1' => '1234',
'name' => 'MyName1'
}
};
如果我在文档中有多个列表:
<?xml version="1.0" encoding="UTF-8"?>
<fields>
<field>
<f1>1234</f1>
<name>MyName1</name>
</field>
<field>
<f1>567</f1>
<name>MyName2</name>
</field>
</fields>
结果如下:
$VAR1 = {
'field' => {
'MyName1' => {
'f1' => '1234'
},
'MyName2' => {
'f1' => '567'
}
}
};
虽然预期结果如下:
$VAR1 = { [
'field' => {
'f1' => '1234',
'name' => 'MyName1'
},
'field' => {
'f1' => '567',
'name' => 'MyName2'
}
]
};
XML :: Simple解析器的哪些选项会阻止使用标记引用替换标记内容并使用<field>
数组?
答案 0 :(得分:5)
默认情况下。 XML ::简单名称按标记<name>
,<key>
和<id>
的值散列键。您可以通过KeyAttr setting自定义此行为。
因此,产生最接近您期望的结构的代码是:
#!/usr/bin/env perl
use common::sense;
use Data::Dumper;
use XML::Simple;
local $/ = undef;
say Dumper XMLin(<DATA>, KeyAttr => []);
__DATA__
<?xml version="1.0" encoding="UTF-8"?>
<fields>
<field>
<f1>1234</f1>
<name>MyName1</name>
</field>
<field>
<f1>567</f1>
<name>MyName2</name>
</field>
</fields>
这是输出:
$VAR1 = {
'field' => [
{
'f1' => '1234',
'name' => 'MyName1'
},
{
'f1' => '567',
'name' => 'MyName2'
}
]
};
答案 1 :(得分:4)
使用ForceArray => 'field'
选项XMLin
。
通常,您无法模拟XML::Simple
返回到您想要的任何数据结构。 XML::Simple
太简单了。但是,您的用例是documentation中描述的用例。我建议您阅读至少标记为important
的所有项目的文档,因为它确实有助于了解您在XML::Simple
返回的整形结构中的选项。