Lun Ene 08, 2007 6:21 am
|
 |
infojose
Perlero Nuevo

|
Registrado: 08 Ene 2007
Mensajes: 4
|
|
| Modificar un xml mediante Perl |
|
|
Me gustaría saber como puedo añadir nuevos datos a un archivo existente xml sin tener que crearme uno nuevo.
gracias |
|
|
|
Lun Ene 08, 2007 7:09 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Lun Ene 08, 2007 8:29 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
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> |
|
|

Lun Ene 08, 2007 5:20 pm
|
 |
Perl user
Maestro Honorario

|
Registrado: 03 Nov 2004
Mensajes: 385
|
|
| Re: Modificar un xml mediante Perl |
|
|
| 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, |
|
Mar Ene 09, 2007 3:43 am
|
 |
infojose
Perlero Nuevo

|
Registrado: 08 Ene 2007
Mensajes: 4
|
|
|
|
|
| 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. |
|

Mar Ene 09, 2007 4:13 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|

Mar Ene 16, 2007 12:51 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
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. |
|
Vie Jun 20, 2008 4:39 am
|
|
|
| Tutorial LibXML |
|
|
¿Sabe alguien dónde puedo encontrar un tutorial de LibXML?
Gracias,
Xagutxu |
|
Mar Jun 24, 2008 10:09 am
|
 |
danimera
Perlero Adicto

|
Registrado: 23 Jun 2005
Mensajes: 212
Ubicación: Colombia
|
|
|
|
|
| ¡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. |
|
Mar Jun 24, 2008 10:42 am
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
| Eso depende de la estructura que tenga el XML... Habrá que verla con el Data::Dumper; |
|

Mie Jul 23, 2008 2:44 pm
|
 |
liraos
Perlero Nuevo

|
Registrado: 23 Jul 2008
Mensajes: 5
Ubicación: Medellin, Antioquia, Colombia
|
|
| Agregar nodo xml |
|
|
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. |
|

Mie Jul 23, 2008 3:44 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
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 |
|

Mie Jul 23, 2008 4:30 pm
|
 |
liraos
Perlero Nuevo

|
Registrado: 23 Jul 2008
Mensajes: 5
Ubicación: Medellin, Antioquia, Colombia
|
|
|
|
|
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 |
|
Mie Jul 23, 2008 5:35 pm
|
 |
explorer
Moderador

|
Registrado: 24 Jul 2005
Mensajes: 4018
Ubicación: Valladolid, España
|
|
|
|
|
| Debes agregar la opción OutputFile => 'kk.xml' en el XMLout(). |
|
Powered by phpBB © 2001, 2005 phpBB Group
|