• Publicidad

Cambiar orden nodos XML

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Cambiar orden nodos XML

Notapor vicca » 2012-10-26 03:25 @184

¡Hola de nuevo!

Necesito ordenar los nodos de un archivo XML para que se adapten a un orden determinado por un XSD.
Por ejemplo, si tengo:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <perro>
  2.   <patas>
  3.     <cantidad>4</cantidad>
  4.   </patas>
  5.   <orejas>
  6.     <cantidad>2</cantidad>
  7.   </orejas>
  8.   <cabeza>
  9.     <cantidad>1</cantidad>
  10.   </cabeza>
  11.   <cola>
  12.     <cantidad>1</cantidad>
  13.   </cola>
  14. </perro>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Y necesitaría que apareciese así:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <perro>
  2.   <cabeza>
  3.     <cantidad>1</cantidad>
  4.   </cabeza>
  5.   <orejas>
  6.     <cantidad>2</cantidad>
  7.   </orejas>
  8.   <patas>
  9.     <cantidad>4</cantidad>
  10.   </patas>
  11.   <cola>
  12.     <cantidad>1</cantidad>
  13.   </cola>
  14. </perro>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


¿Cómo podría hacerlo? Porque estoy bastante perdido con esto...

Muchas gracias.
vicca
Perlero nuevo
Perlero nuevo
 
Mensajes: 17
Registrado: 2012-04-16 03:44 @197

Publicidad

Re: Cambiar orden nodos XML

Notapor explorer » 2012-10-26 07:25 @350

Bueno, depende de lo complicado que sea el problema, al final, pero con lo expuesto se puede resolver así:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use XML::Simple;
  3.  
  4. my $xml_ref = XMLin('code_32753.xml', KeepRoot => 1, NoAttr => 1);
  5.  
  6. print XMLout($xml_ref, KeepRoot => 1, NoAttr => 1);
  7.  
  8. sub XML::Simple::sorted_keys {
  9.     my($self, $name, $hashref) = @_;
  10.  
  11.     if ($name eq 'perro') {
  12.         return qw( cabeza orejas patas cola );
  13.     }
  14.     else {
  15.         return sort keys %$hashref;
  16.     }
  17. }
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4

Esto es un poco burdo, pero funciona: leemos el XML y lo volvemos a escribir, pero en la operación de salida, sobreescribimos la función que devuelve el orden de las claves del paquete XML::Simple, de tal forma que salen las claves en el orden que queremos cuando estamos en el nodo 'perro', y en el orden alfabético en caso de los demás.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: Bing [Bot] y 21 invitados