1

XML ::Simpleperl解析を使用して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

デフォルトでは。XML :: Simpleは、タグ、、およびの値によってハッシュキーに名前を<name>付け<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 に答える