Perl en Español

  1. Home
  2. Tutoriales
  3. Foro
  4. Artículos
  5. Donativos
  6. Publicidad
 

Modificar un xml mediante Perl

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Módulos
Mensaje Lun Ene 08, 2007 6:21 am
infojose
Perlero Nuevo
Perlero Nuevo
Registrado: 08 Ene 2007
Mensajes: 4
Modificar un xml mediante Perl Responder citando

Me gustaría saber como puedo añadir nuevos datos a un archivo existente xml sin tener que crearme uno nuevo.
gracias
Mensaje Lun Ene 08, 2007 7:09 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Bienvenido a los foros de Perl en Español.

Para añadir nuevos datos a un xml, lo normal es parsear el actual xml, añadir los datos y grabar el nuevo xml.

Creo que algún motor de base de datos ya lo puede hacer en un sólo paso, pero, internamente, hace eso.

En este foro encontrarás varias soluciones para XML. Usa el sistema de búsqueda y verás que se suele usar el módulo XML::Simple, aunque sería más recomendable usar el XML::Twig o el XML::Smart. En CPAN hay muchos más módulos para tratar XML. Casi más difícil que manejar xml es decidirse por qué módulo usar.
Mensaje Lun Ene 08, 2007 8:29 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Aquí hay un ejemplo con XML::Simple. El problema con este módulo es que, al ser tan simple, nos obliga a conocer bien cómo se organizan las estructuras de datos en Perl:
Sea el fichero kk.xml:
XML:
<?xml version='1.0' standalone='yes'?>
<articulos>
  <articulo>
    <editorial>Edelvives</editorial>
    <nombre>Juan Ramón</nombre>
    <year>1963</year>
  </articulo>
</articulos>
Con este programa:
Perl:
#!/usr/bin/perl

use XML::Simple;

# Lo leemos
my $xml = XMLin("kk.xml",ForceArray => ['articulo']);

# Lo modificamos, agregando un nuevo artículo
push @{ $xml->{articulo} }, {
    nombre      => 'Agustin de Valdehorras',
    editorial   => 'Santillana',
    year        => '1977',
};

# Salida a pantalla (podría ser también un fichero)
print XMLout($xml,RootName=>'articulos',NoAttr=>1,XMLDecl => 1);
lo convertimos a:
XML:
<?xml version='1.0' standalone='yes'?>
<articulos>
  <articulo>
    <editorial>Edelvives</editorial>
    <nombre>Juan Ramón</nombre>
    <year>1963</year>
  </articulo>
  <articulo>
    <editorial>Santillana</editorial>
    <nombre>Agustin de Valdehorras</nombre>
    <year>1977</year>
  </articulo>
</articulos>
Mensaje Lun Ene 08, 2007 5:20 pm
Perl user
Maestro Honorario
Maestro Honorario
Registrado: 03 Nov 2004
Mensajes: 385
Re: Modificar un xml mediante Perl Responder citando

infojose escribió:
Me gustaría saber como puedo añadir nuevos datos a un archivo existente xml sin tener que crearme uno nuevo.
gracias


Si realmente lo que quieres es tener control completo de cómo generas un documento XML bien formado échale un vistazo a XML::LibXML. Claro está, dando por hecho que tienes conocimiento sobre DOM (cualquier nivel).

Saludos,
Mensaje Mar Ene 09, 2007 3:43 am
infojose
Perlero Nuevo
Perlero Nuevo
Registrado: 08 Ene 2007
Mensajes: 4
Responder citando

ok! muchas gracias, lo unico es que a mi me gustaria saber si puedo añadir directamente los nuevos datos al fichero kk.xml(ejemplo anterior) sin tener que crearme uno nuevo, y en caso de que no pueda como puedo tratar el tema de las lineas que son cabeceras para qu no se m e cierren al final del archivo.
Mensaje Mar Ene 09, 2007 4:13 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Yo no conozco ningún módulo (quizás exista) que permita actualizar un xml sin tener que cargarlo en memoria.

Algunos, como el XML::Twig permite procesar ficheros xml grandes procesándolos en bloques, pero si se trata de modificarles, la solución creo que siempre es la misma: crear un nuevo fichero. Que luego ese fichero sobreescriba al original es cuestión de una línea más en Perl.

Y para tratarlo línea a línea, como dices al final, no entiendo eso de que no se cierren al final del archivo. Si no se cierran las etiquetas entonces será un xml mal formado y en algunos sistemas te dará error.
Mensaje Mar Ene 16, 2007 12:51 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Bueno... hay una forma... Perl es capaz de procesar ficheros de texto de forma interactiva. Es decir, procesar el fichero línea a línea, modificarla o no, y el resultado queda en el mismo fichero.

Es lo que se puede hacer con la combinación del 'pie': perl -p -i -e 'script' fichero.
Mensaje Vie Jun 20, 2008 4:39 am
xagutxu_perez
Perlero Nuevo
Perlero Nuevo
Registrado: 04 Abr 2008
Mensajes: 43
Tutorial LibXML Responder citando

¿Sabe alguien dónde puedo encontrar un tutorial de LibXML?

Gracias,

Xagutxu
Mensaje Mar Jun 24, 2008 10:09 am
danimera
Perlero Adicto
Perlero Adicto
Registrado: 23 Jun 2005
Mensajes: 212
Ubicación: Colombia
Responder citando

¡Huy!, ya que estoy trabajando algo similar... ¿Me puedes decir, explorer, con ese ejemplo que tienes ahí, cómo podría modificar un dato de los que tengo? Es que hasta ahora lo que hago es modificar mi BD y después generar el XML.
Mensaje Mar Jun 24, 2008 10:42 am
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Eso depende de la estructura que tenga el XML... Habrá que verla con el Data::Dumper;
Mensaje Mie Jul 23, 2008 2:44 pm
liraos
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Jul 2008
Mensajes: 5
Ubicación: Medellin, Antioquia, Colombia
Agregar nodo xml Responder citando

Hola.

Tengo un xml con la siguiente estructura:
XML:
<?xml version="1.0"?>
<list>
        <urll>anonym_project_te_vagy_a_legjobb.mp3</urll>
        <urll>fixing_my_brain.mp3</urll>
        <urll>if_you_are_lost_for_somewhere_else_to_be_the_heavens.mp3</urll>
        <urll>like_an_angel.mp3</urll>
        <urll>making_me_nervous_brand_sucks.mp3</urll>
        <urll>the_struggle.mp3</urll>
        <urll>it_is_a_beautiful_day.mp3</urll>
</list>


y necesito agregarle otro nodo:
XML:
<urll>cualquierCosa.mp3</urll>


estoy haciendo lo siguiente:
Perl:
my $xml = XMLin("$croot/prueba.xml",ForceArray => ['urll']);

foreach my $fileName (@{$Atachments->getFiles}) {
                   $fileUrl = $Atachments->getUrl($fileName);
                   $fileUrl= $self->session->url->getSiteURL . $fileUrl;
                   push @{ $xml->{urll}=> [$fileUrl]}
                   print XMLout($xml,RootName=>"list",NoAttr=>1,XMLDecl=>1);
}


Pero no me funciona, ¿alguien me puede decir que estoy haciendo mal?

Gracias.
Mensaje Mie Jul 23, 2008 3:44 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Recuerda: Data::Dumper es tu amigo.

Cuando trabajamos con XML::Simple, lo primero es saber el aspecto que tiene la estructura que hemos leído con XMLin, para saber cómo manipularla. Eso se hace un 1 minuto.

Y luego, dos horas más tarde, adivinamos el conjunto necesario de opciones que hay que agregar a XMLout() para que vuelva a salir el mismo XML que teníamos al principio.

Lo que quieres se puede hacer así:
Perl:
#!/usr/bin/perl
use strict;
use warnings;
use XML::Simple qw(:strict);
use Data::Dumper;

my $xml = XMLin('kk.xml', ForceArray => 1, KeyAttr => 0);

push @{$xml->{urll}}, 'cualquierCosa.mp3';

#print Dumper($xml);

print XMLout($xml,KeyAttr=>{},RootName=>'list', XMLDecl => '<?xml version="1.0"?>');

__END__
El XML::Simple es para hacer cosas simples (por ejemplo, leer un XML o crear uno sencillo), pero a veces... lo complica demasiado.

Ultima edición por explorer el Vie Jul 25, 2008 1:42 am, editado 1 vez
Mensaje Mie Jul 23, 2008 4:30 pm
liraos
Perlero Nuevo
Perlero Nuevo
Registrado: 23 Jul 2008
Mensajes: 5
Ubicación: Medellin, Antioquia, Colombia
Responder citando

Muchas gracias, ya veo que me agrega, pero y si lo que yo quiero es que me lo agregue en el mismo archivo xml y no imprimirlo, ¿qué debo hacer?

Saludos
Mensaje Mie Jul 23, 2008 5:35 pm
explorer
Moderador
Moderador
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
Responder citando

Debes agregar la opción OutputFile => 'kk.xml' en el XMLout().
Publicar nuevo tema   Responder al tema    Foros de discusión -> Módulos Todas las horas son GMT - 6 Horas
Página 1 de 1



Powered by phpBB © 2001, 2005 phpBB Group