XML ::简单如何使用refference?</name>阻止<name>内容替换

时间:2012-12-08 21:47:10

标签: perl xml-parsing

我尝试使用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>数组?

2 个答案:

答案 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返回的整形结构中的选项。