2009-07-08 3 views
1

Я просто хочу найти способ отключить операции сортировки в XML::SimpleКак отключить сортировку subtag в XML-файле Perl :: 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 :: Simple)

, если мы хотим, чтобы порядок элементов исходного документа, сохраняется. К сожалению, это невозможно в XML :: Simple. Когда документ анализируется, XML :: Simple хранит данные элемента в хэшах. Хеши не помнят порядок добавления ключей, чтобы эти данные были потеряны.

Если мы хотим сохранить заказ документа, вам нужно использовать другой модуль. он рекомендует XML :: LibXML. На самом деле он написал статью о переходе от XML :: Simple к 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

+0

На самом деле, порядок элементов значителен в XML. DTD и схемы позволяют указать, в каком порядке элементы должны появляться в документе. OTOH, порядок атрибутов обычно не считается значимым. – mirod

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; 
Смежные вопросы