如何在Perl';s XML::简单?

如何在Perl';s XML::简单?,xml,perl,xml-simple,Xml,Perl,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_x

我只是想找到一种方法,在中禁用排序操作

例如:

#!/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>

test@example.com
测试
但我希望输出是:

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

测试
test@example.com

如何实现这一点?

哈希表中元素的顺序不能保证与您输入它们的顺序一致。您是否尝试打印出哈希表的元素以验证它们是否符合您想要的顺序

此外,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
~/dot-dash-dot.com/files>perl testxml.pl
搞砸:
ID=5
姓名=罗恩
电子邮件=罗恩。savage@gmail.com
XML:
这是perl,v5.8.4,为i386 linux多线程构建

哈希表中元素的顺序不能保证与您输入它们的顺序一致。您是否尝试打印出哈希表的元素以验证它们是否符合您想要的顺序

此外,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
~/dot-dash-dot.com/files>perl testxml.pl
搞砸:
ID=5
姓名=罗恩
电子邮件=罗恩。savage@gmail.com
XML:
这是perl,v5.8.4,为i386 linux多线程构建
这似乎对你有帮助

在我的测试中,在下面代码的哈希中反转电子邮件和姓名行会导致它们在输出中反转。我不确定更复杂的数据结构是否仍然如此,这取决于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;
看来这对你有帮助

在我的测试中,在下面代码的哈希中反转电子邮件和姓名行会导致它们在输出中反转。我不确定更复杂的数据结构是否仍然如此,这取决于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;
根据(XML::Simple的作者)

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

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

根据(XML::Simple的作者)

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

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


是的,我同意。但我正在寻找不进行任何排序的选项实际上,元素的顺序在XML中很重要。DTD和模式允许您指定元素在文档中的显示顺序。OTOH,属性的顺序通常不被认为是重要的。是的,我同意。但我正在寻找不进行任何排序的选项实际上,元素的顺序在XML中很重要。DTD和模式允许您指定元素在文档中的显示顺序。当然,属性的顺序通常不被认为是重要的。