Perl XML::Simple 输出嵌套节点

Perl XML::Simple output nested node

作为我的输入

$XML = {'node1' => {'node2' => {'node3' => {'node4'}}}};

然后我生成输出 xml

print(XMLout($XML, KeepRoot => 1));

然后我得到

<node1>
  <node2 name="node3" node4="" />
</node1>

如何将其作为输出

<node1>
  <node2>
    <node3>
      <node4></node4>
    </node3>
  </node2>
</node1>
 perl -MXML::Simple -e '$XML = {"n1" => {"n2" => [{"n3" => [{"n4"=>[{}]}]}]}}; 
                        print(XMLout($XML, KeepRoot=>1));'

给予

<n1>
  <n2>
    <n3>
      <n4></n4>
    </n3>
  </n2>
</n1>

不鼓励使用 XML::Simple。 https://metacpan.org/pod/XML::Simple

XML::Simple 实际上并不易于使用。你最好选择 XML::LibXML.

下面是一个示例,展示了如何找到数据结构的外观。

use warnings;
use strict;
use XML::Simple;
use Data::Dumper;

my $sample = 
"<node1>
  <node2>
    <node3>
      <node4></node4>
    </node3>
  </node2>
</node1>";

my $xs = XML::Simple->new(ForceArray => 1, KeepRoot => 1);
my $ref = $xs->XMLin($sample);

print "\n---------------\n", Dumper($ref), "\n--------------\n";

my $xml = $xs->XMLout($ref);
print "\n----------------\n";
print $xml;

Data::Dumper 的输出显示了数据结构。

---------------
$VAR1 = {
          'node1' => [
                       {
                         'node2' => [
                                      {
                                        'node3' => [
                                                     {
                                                       'node4' => [
                                                                    {}
                                                                  ]
                                                     }
                                                   ]
                                      }
                                    ]
                       }
                     ]
        };

--------------

----------------
<node1>
  <node2>
    <node3>
      <node4></node4>
    </node3>
  </node2>
</node1>

如果没有 ForceArray,它看起来就像您收到的输出。