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

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 に答える