1

我只想找到在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>

我怎样才能做到这一点?

4

3 回答 3

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;
于 2009-07-08T19:44:48.273 回答
4

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

如果我们想要保留原始文档中元素的顺序。不幸的是,这对于 XML::Simple 是不可能的。解析文档时,XML::Simple 将元素数据存储在散列中。哈希不记得添加键的顺序,因此该数据丢失。

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

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

于 2009-07-09T08:26:27.293 回答
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
于 2009-07-08T14:16:56.133 回答