2009-07-08 58 views
1

我只是想找到禁止排序操作的方式XML::Simple如何在Perl的XML :: Simple中禁用子標籤排序?

例如:

#!/usr/bin/perl 

use strict; 
use warnings; 

use XML::Simple; 

my %my_xml = (
    NAME => [ 'test' ], 
    EMAIL => [ '[email protected]' ], 
    ID => 12, 
); 

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

__END__ 

我獲得以下的輸出:

<datas ID="12"> 
    <EMAIL>[email protected]</EMAIL> 
    <NAME>test</NAME> 
</datas> 

但我想輸出是:

<datas ID="12"> 
    <NAME>test</NAME> 
    <EMAIL>[email protected]</EMAIL> 
</datas> 

我該如何做到這一點?

回答

4

根據Grant McLean(XML ::簡單的作者)

,如果我們想要的是從原來的文檔元素被保留的順序。不幸的是,這對於XML :: Simple來說是不可能的。文檔解析後, XML :: Simple將元素數據存儲在散列中。哈希不記得 添加密鑰的順序,所以這些數據丟失了。

如果我們想要保留文件順序,您需要使用不同的模塊。他建議使用XML :: LibXML。事實上,他寫了一篇有關從XML轉換這裏::簡單XML ::的libxml:

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

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 protected] 
XML: 
<datas ID="5" NAME="Ron" EMAIL="[email protected]" /> 

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

是的,我同意。但我正在尋找與任何排序選項 – joe 2009-07-08 14:19:42

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', '[email protected]'); 

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; 
相關問題