2008-09-30 23 views
24

Necesito crear XML en Perl. Por lo que leí, XML::LibXML es ideal para analizar y usar XML que proviene de otro lado. ¿Alguien tiene alguna sugerencia para un escritor de XML? ¿Todavía se mantiene XML::Writer? ¿Alguien le gusta/lo usa?¿Cómo puedo crear XML desde Perl?

Además de la funcionalidad completa, me interesa una sintaxis fácil de usar, así que describa la sintaxis y cualquier otra razón por la que le gusta ese módulo en su respuesta.

Responda con una sugerencia por respuesta, y si alguien ya ha respondido con su favorito, vote esa respuesta. Con suerte, será fácil ver cuál es el más popular.

Gracias!

Respuesta

20

XML :: Writer todavía se mantiene (al menos, a partir de febrero de este año), y es de hecho uno de los escritores favoritos de Perl XML.

En cuanto a la descripción de la sintaxis, es mejor consultar la documentación del módulo (el enlace ya está en la pregunta). A saber:

use XML::Writer; 

    my $writer = new XML::Writer(); # will write to stdout 
    $writer->startTag("greeting", 
        "class" => "simple"); 
    $writer->characters("Hello, world!"); 
    $writer->endTag("greeting"); 
    $writer->end(); 
    $output->close(); 

    # produces <greeting class='simple'>Hello world!</greeting> 
+0

Gracias, que se veía en la documentación de XML :: Writer. Esperaba una sintaxis algo más limpia, así que esperaré un poco para ver si alguien más responde con alguna sugerencia, pero si esta parece ser la favorita, entonces me iré con ella. – pkaeding

+2

Sintaxis "quizás" larga en el diente pero XML :: Writer me ha servido bien durante más de 8 años. Es el que busco primero cuando necesito crear XML desde Perl. Para algo más "más sexy", consulte XML :: Class (sin embargo, tenga en cuenta que esto no se ha actualizado desde 2005). – draegtun

+3

Re. "sintaxis limpia", la etiqueta "saludo" en el ejemplo anterior podría haberse escrito: $ writer-> dataElement ("saludo", "¡Hola, mundo!", "clase" => "simple"). No veo cuánto más simple podría ser esto. –

7

no hago mucho XML, pero XML::Smart parece que podría hacer lo que quiera. Eche un vistazo a la sección Creating XML Data en el documento y se ve muy simple y fácil de usar.

Parafraseando el doc:

use XML::Smart; 

## Create a null XML object: 
my $XML = XML::Smart->new() ; 

## Add a server to the list: 
$XML->{server} = { 
    os => 'Linux' , 
    type => 'mandrake' , 
    version => 8.9 , 
    address => [ '192.168.3.201', '192.168.3.202' ] , 
} ; 

$XML->save('newfile.xml') ; 

que pondría esto en newfile.xml:

<server os="Linux" type="mandrake" version="8.9"> 
    <address>192.168.3.201</address> 
    <address>192.168.3.202</address> 
</server> 

fresca. Voy a tener que jugar con esto :)

3

XML :: Smart se ve bien, pero no recuerdo haber estado disponible cuando estaba usando XML::Simple hace muchos años. Buena interfaz, y funciona bien para leer y escribir XML.

8

Si desea tomar una estructura de datos en Perl y convertirla en XML, XML::Simple hará el trabajo muy bien.

En su forma más simple:

 
my $hashref = { foo => 'bar', baz => [ 1, 2, 3 ] }; 
use XML::Simple; 
my $xml = XML::Simple::XMLout($hashref); 

Como su nombre indica, su uso básico es simple; sin embargo, ofrece muchas funciones si las necesita.

Naturalmente, también puede analizar XML fácilmente.

1

Me gusta XML::TreeBuilder porque se ajusta a la forma en que pienso. Históricamente, lo he usado más para analizar que para emitir.

Unas semanas después de que se publicó esta pregunta, tuve la oportunidad de generar algunos XML de Perl. Investigué los otros módulos que figuran aquí, suponiendo que uno de ellos funcionaría mejor que XML :: TreeBuilder, pero TreeBuilder seguía siendo la mejor opción para lo que quería.

Una desventaja es que no hay forma de representar instrucciones de procesamiento y declaraciones en un objeto XML :: TreeBuilder.

+0

Estoy de acuerdo contigo, Brian. En mi caso, decidí darle una oportunidad a XML :: LibXML también para escribir porque el código que estaba cambiando ya estaba usando XML :: LibXML para otras tareas. – cosimo

+2

Brian es solo el editor que agregó el enlace; Yo soy el que hizo el comentario. :) – skiphoppy

27

Solo para el registro, aquí hay un fragmento que usa XML :: LibXML.

#!/usr/bin/env perl 

# 
# Create a simple XML document 
# 

use strict; 
use warnings; 
use XML::LibXML; 

my $doc = XML::LibXML::Document->new('1.0', 'utf-8'); 

my $root = $doc->createElement("my-root-element"); 
$root->setAttribute('some-attr'=> 'some-value'); 

my %tags = (
    color => 'blue', 
    metal => 'steel', 
); 

for my $name (keys %tags) { 
    my $tag = $doc->createElement($name); 
    my $value = $tags{$name}; 
    $tag->appendTextNode($value); 
    $root->appendChild($tag); 
} 

$doc->setDocumentElement($root); 
print $doc->toString(); 

y salidas: esta

<?xml version="1.0" encoding="utf-8"?> 
<my-root-element some-attr="some-value"> 
    <color>blue</color> 
    <metal>steel</metal> 
</my-root-element> 
Cuestiones relacionadas