如何在Perl的XML :: Simple中禁用子标签排序?

时间:2009-07-08 14:03:00

标签: xml perl xml-simple

我只想找到在XML::Simple

中禁用排序操作的方法

例如:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Simple;

my %my_xml = (
    NAME  => [ 'test' ],
    EMAIL => [ 'test@example.com' ],
    ID    => 12,
);

my $xs = XML::Simple->new;
print $xs->XMLout(\%my_xml, RootName => "datas", NoSort => 1);

__END__

我得到以下输出:

<datas ID="12">
  <EMAIL>test@example.com</EMAIL>
  <NAME>test</NAME>
</datas>

但我希望输出为:

<datas ID="12">
  <NAME>test</NAME>
  <EMAIL>test@example.com</EMAIL>
</datas>

我怎样才能做到这一点?

3 个答案:

答案 0 :(得分:5)

似乎Tie::IxHash可以帮到你。

在我的测试中,在下面的代码中反转哈希中的电子邮件和名称行导致它们在输出中被反转。我不确定更复杂的数据结构是否会出现这种情况,具体取决于XML :: Simple是重用原始哈希还是复制它。

#!/usr/bin/perl

use strict;
use warnings;

use Tie::IxHash;
use XML::Simple;

my( $id, $name, $email)= ( 'i1', 'John Doe', 'jdoe@example.com');

my %my_xml;
tie %my_xml, 'Tie::IxHash';
%my_xml = (
            'EMAIL' => [$email],                   
            'NAME' => [$name],
             'ID'  => $id,
          );

my $xs = XML::Simple->new();
my $xml_ref = \%my_xml ;
my $xml = $xs->XMLout($xml_ref, RootName=> "datas" ,NoSort => 1);

print $xml;

答案 1 :(得分:4)

根据Grant McLean(XML :: Simple的作者)

  

如果我们想要保留原始文档中元素的顺序。不幸的是,XML :: Simple无法做到这一点。解析文档时   XML :: Simple将元素数据存储在哈希中。哈希不记得了   添加密钥的顺序,以便丢失此数据。

如果我们想要保留文档顺序,则需要使用其他模块。他推荐使用XML :: LibXML。事实上,他写了一篇关于从XML :: Simple切换到XML :: LibXML的文章:

http://www.perlmonks.org/index.pl?node_id=490846

答案 2 :(得分:0)

哈希表中元素的顺序不保证按您输入的顺序排列。您是否尝试打印出哈希表的元素以验证它们是否符合您的要求?

此外,XML文件中元素的顺序对于读取XML的任何应用程序都无关紧要 - 信息仍然存在并由标记标记。

罗恩

此测试似乎表明nosort选项正常工作,它只是哈希的顺序:

use strict;
use XML::Simple;

my $name        = "Ron";
my $email       = "ron.savage\@gmail.com";
my $id          = 5;

my %my_xml = (  'NAME' => $name, 'EMAIL' => $email, 'ID' => $id );

my $var;
my $val;
print "Hash: \n";
foreach $var (keys(%my_xml)) 
   {
   $val = $my_xml{$var};
   print "    ${var}=${val}\n";
   }

my $xs = XML::Simple->new();
my $xml_ref = \%my_xml ;
my $xml = $xs->XMLout($xml_ref, RootName=> "datas" ,nosort => 1);

print "XML:\n".$xml;

输出:

~/dot-dash-dot.com/files >perl testxml.pl
Hash:
    ID=5
    NAME=Ron
    EMAIL=ron.savage@gmail.com
XML:
<datas ID="5" NAME="Ron" EMAIL="ron.savage@gmail.com" />

This is perl, v5.8.4 built for i386-linux-thread-multi