1

我尝试使用 XML::Simple perl 解析来解析 xml 文档。我注意到,如果文件看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<fields>
  <field>
    <f1>1234</f1>
    <name>MyName1</name>
  </field>
</fields>

print(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>代替?

4

2 回答 2

5

默认。<name>XML::Simple 通过标签和<key>的值命名散列键<id>。您可以通过KeyAttr 设置自定义此行为。因此,产生最接近您期望的结构的代码是:

#!/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'
                 }
               ]
    };
于 2012-12-08T22:26:34.857 回答
4

使用ForceArray => 'field'选项来XMLin

通常,您无法塑造XML::Simple返回到您想要的任何数据结构的数据结构。XML::Simple太简单了。但是,您的用例是文档中描述的用例。我建议您阅读所有标记为important至少的项目的文档,因为它确实有助于了解您在塑造由XML::Simple.

于 2012-12-08T22:16:20.037 回答