2009-07-08 6 views
1

Je veux juste trouver le moyen de désactiver l'opération de tri dans XML::SimpleComment désactiver le tri des sous-tags dans XML :: Simple de Perl?

Par exemple:

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

je suis sortie suivante:

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

Mais je veux que la sortie soit:

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

Comment puis-je y parvenir?

Répondre

4

Selon le Grant McLean (auteur de XML :: Simple)

si nous voulons est de l'ordre des éléments du document original à retenir. Malheureusement, ce n'est pas possible avec XML :: Simple. Lorsque le document est analysé, XML :: Simple stocke les données de l'élément dans des hachages. Les hachages ne se souviennent pas de l'ordre dans lequel les clés ont été ajoutées afin que ces données soient perdues.

Si nous voulons conserver l'ordre des documents, vous devez utiliser un autre module. il recommande XML :: LibXML. En fait, il a écrit un article sur le passage de XML :: Simple XML :: LibXML ici:

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

0

L'ordre des éléments dans une table de hachage n'est pas garanti dans l'ordre dans lequel vous les entrez. Avez-vous essayé d'imprimer les éléments de la table de hachage pour vérifier qu'ils sont dans l'ordre que vous voulez?

En outre, l'ordre des éléments dans un fichier XML ne devrait importer pour aucune application lisant le XML - l'information est toujours là et étiquetée par le tag.

Ron

Ce test semble montrer que l'option NOSORT fonctionne, il est juste l'ordre du hachage:

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; 

sortie:

~/dot-dash-dot.com/files >perl testxml.pl 
Hash: 
    ID=5 
    NAME=Ron 
    [email protected] 
XML: 
<datas ID="5" NAME="Ron" EMAIL="ron.s[email protected]" /> 

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

Oui je suis d'accord. Mais je suis à la recherche d'une option sans aucun tri – joe

+0

En fait, l'ordre des éléments est significatif en XML. Les DTD et les schémas vous permettent de spécifier dans quel ordre les éléments doivent apparaître dans un document. OTOH, l'ordre des attributs n'est généralement pas considéré comme significatif. – mirod

5

Il semble que Tie::IxHash peut T'aider.

Dans mes tests, l'inversion des lignes de courrier électronique et de nom dans le hachage du code ci-dessous entraîne leur inversion dans la sortie. Je ne suis pas sûr que ce soit toujours le cas avec des structures de données plus complexes, selon que XML :: Simple réutilise le hash d'origine ou le copie.

#!/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; 
Questions connexes