• Publicidad

Crear un fichero XML

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

Notapor fgalves » 2007-01-15 04:07 @213

Hola de nuevo Explorer,

Gracias por tus aportaciones y consejos.
He intentado usar el modulo XML::Smart pero no esta instalado. El unico de los que me recomendaste que veo disponible es el XML::Twig.
Es dicho modulo facil de usar y me permite obtener todas las funcionalidades que quiero?
- XML en salida con nodos y parametros en el mismo orden de insercion
- insertar lineas del tipo:
<!DOCTYPE Projection SYSTEM "projection.dtd">
o
<NoHeader />

- hacer un check del XML creado pasandole como entrada un fichero DTD

Explorer, conoces algun link con ejemplos sobre el uso de dicho modulo?
Es tambien util con ficheros XML pequenos?

Muchas gracias por cualquier informacion que me puedas dar.
Un saludo!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Publicidad

Notapor explorer » 2007-01-15 13:56 @622

Si se trata sólo de crear el XML, primero lo intentaría con XML::Writer, que sí permite lo que indicas:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use XML::Writer;

my $xml;
my $writer   = new XML::Writer(
                    OUTPUT      => \$xml,
                    DATA_MODE   => 1    ,
                    DATA_INDENT => 2    );

my @families = qw ( EDI MDW EXT );

###
$writer->xmlDecl();
$writer->doctype('Projection', undef, 'projection.dtd');

###
$writer->startTag("Projection");

    foreach my $family ( @families ) {
        $writer->emptyTag("Family", Name => $family, Major => 1, Minor => 0);
    }

    $writer->dataElement("Name","FUNCTIONS");

    $writer->startTag("DisplayParams");
        $writer->emptyTag("FlatReportSeparator", Value => '');
        $writer->emptyTag('NoHeader');
        $writer->emptyTag('LazyStatDisplay');
    $writer->endTag();

$writer->endTag();

###
$writer->end();
print $xml;

__END__
Coloreado en 0.003 segundos, usando GeSHi 1.0.8.4
Salida:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
<?xml version="1.0"?>
<!DOCTYPE Projection SYSTEM "projection.dtd">

<Projection>
  <Family Name="EDI" Major="1" Minor="0" />
  <Family Name="MDW" Major="1" Minor="0" />
  <Family Name="EXT" Major="1" Minor="0" />
  <Name>FUNCTIONS</Name>
  <DisplayParams>
    <FlatReportSeparator Value="" />
    <NoHeader />
    <LazyStatDisplay />
  </DisplayParams>
</Projection>
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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

Notapor fgalves » 2007-01-16 02:45 @156

Hola Explorer,

Gracias por la informacion, pero desgraciadamente tampoco tengo acceso a XML::Writer.
Solo dispongo de XML::Simple y XML::Twig. Teniendo en cuenta que XML::Simple no me permite respetar el orden de insercion para el XML que me construyo, lo he descartado y por lo tanto solo me queda XML::Twig. He leido algo de la documentacion del CPAN, pero se me hace algo confuso y poco claro, con muy pocos ejemplos de utilizacion.

Desgraciadamente, no consigo acceder a la pagina oficial, [url]xmltwig.com/[/url]que es donde se supone, estan todos los tutoriales y ejemplos expuestos por Michel Rodriguez.

De hecho, lo unico que me haria falta es acceder a los nodos y parametros para recuperar los valores, tal y como hacia antes con XML::Simple.
Tambien saber como generar un XML en output (guardando el orden de insercion).

He aqui el formato del XML que deseo leer:

Código: Seleccionar todo
<?xml version='1.0'?>

<REQUEST>

<FORCED flag="N" />

<SELECTION>
<Field family="Family Name1" field="Field Name 1" label="Label Name1" />

<Field family="Family Name2" field="Field Name 2" label="Label Name2" />
...
</SELECTION>


<PARAMETERS>
<StartTime time="HH:MM" />
<EndTime time="HH:MM" />
<Date date="DD/mm/YYYY" />
</PARAMETERS>

....

</REQUEST>


Y he aqui el poco codigo que llevo escrito para acceder a dichos

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my $refRequest = XML::Twig->new();    
    $refRequest->parsefile($sourceRequestsFolder."/".$filename);
    my $root = $refRequest->root;
   
   
    #
    # read the PARAMETERS section
    #
   
    my $startTime = $root->first_child ('PARAMETERS');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Como queda claro, no tengo mucha idea de como recuperar los diferentes parametros, como por ejemplo, para el nodo PARAMETERS, los valores "time" de StarTime y EndTime, el valor de "date" para Date, etc....

Alguien me podria echar una manita con un ejemplo practico?
Muchisimas gracias,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2007-01-16 03:05 @170

Acabo de encontrar el tutorial de Michel Rodriguez en otra pagina:

http://standards.ieee.org/resources/spa ... ig_s1.html

Voy a leerlo y os tengo al corriente de mis avances.
Saludos!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor fgalves » 2007-01-16 04:20 @222

Hola de nuevo,

De hecho, lo unico que me falta saber y no encuentro en los ejemplos, es como acceder a un atributo de un nodo en particular.

Por ejemplo:

Código: Seleccionar todo
<SELECTION>
<Field family="family1" field="FieldName1" label="LabelName1" />
<Field family="family2" field="FieldName2" label="LabelName2" />
<Field family="family3" field="FieldName3" label="LabelName3" />
...
</SELECTION>


Para ello, tengo el codigo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @selection = $root->first_child('SELECTION')->children;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


En @selection tengo la lista de Fields. Como hago para acceder a los atributos "family", "field" y "label"?
En los ejemplos de Michel, sus XML no tienen atributos y todos son del estilo <name>....</name>

Otro detalle mas: he probado de hacer un use XML::Twig::Elt y parece no estar disponible. Es dicho submodulo completamente necesario o puedo trabajar sin el?

Una ultima pregunta: tengo acceso al modulo XML::LibXML. Es dicho modulo util para mis necesidades? Me permite dicho modulo respetar el orden de insercion en el momento de volcar un XML construido dinamicamente hacia un fichero?

Muchas gracias por cualquier ayuda o consejo,
Saludos,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2007-01-16 12:12 @550

El módulo XML::Twig::Elt está escrito dentro de XML::Twig. Sólo necesitas usar el XML::Twig y ya tendrás acceso a el.
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

Notapor explorer » 2007-01-16 12:59 @582

fgalves escribiste:Para ello, tengo el codigo siguiente:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my @selection = $root->first_child('SELECTION')->children;
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

En @selection tengo la lista de Fields. ¿Cómo hago para acceder a los atributos "family", "field" y "label"?
En los ejemplos de Michel, sus XML no tienen atributos y todos son del estilo <name>....</name>


Para acceder a los atributos de un elemento, es con la clave att:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#!/usr/bin/perl

use XML::Twig;

my $t = XML::Twig->new();
$t->parsefile( 'kk.xml');
my $root= $t->root;

my @fields = $root->first_child( 'SELECTION' )->children;

foreach my $para (@fields) {
    print $para->{'att'}->{'field'};
    print "\n";
}
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
O con la función att():
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
print $para->att('field');
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Salida:
Código: Seleccionar todo
Field Name 1
Field Name 2
Y para colocar nuevos atributos, con set_att().

Lo tienes todo descrito en la página de manual de XML::Twig.
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

Notapor fgalves » 2007-01-17 02:42 @154

Hola a todos,

¡Gracias Explorer por tu ayuda!
Finalmente me puse a trabajar con el modulo XML::LibXML, que me esta dando muy buenos resultados pues consigo generar el fichero XML en salida con el mismo orden de inserción de los elementos ya que maneja un árbol como estructura de datos (igual que en XML::Twig).


Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
#add main root nodes
        my $rootOutput = $tempXML->createElement('Projection');
        $rootOutput->setAttribute('Type',"Projection");
        $rootOutput->setAttribute('ReportName',$reportName);
        $rootOutput->setAttribute('ProcessName',$processName);
        $tempXML->setDocumentElement($rootOutput);
       
        my $familiesOutput = $tempXML->createElement('Families');
        $rootOutput->appendChild($familiesOutput);
       
        my $displayParamsOutput = $tempXML->createElement('DisplayParams');
        $rootOutput->appendChild($displayParamsOutput);
       
        my $projFieldsOutput = $tempXML->createElement('ProjFields');
        $rootOutput->appendChild($projFieldsOutput);
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4



El caso es que todavía se me resiste lo siguiente:

Código: Seleccionar todo
<!DOCTYPE Projection SYSTEM "projection.dtd">


Tengo que añadir la linea siguiente en el XML de salida. Lo he intentado con la operación "createElement" como para los demás nodos, pero se queja diciendo que !DOCTYPE no es un nombre valido.

¿Alguien podría decirme cómo añadir dicho nodo usando XML::LibXML?

¡Muchísimas gracias!
Saludos,
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Notapor explorer » 2007-01-17 07:23 @349

Creo que es usando createInternalSubset de XML::LibXML::Document.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
   my $document = XML::LibXML::Document->new();
   my $dtd      = $document->createInternalSubset( "foo", undef, "foo.dtd" );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  <?xml version="1.0"?>
   <!DOCTYPE foo SYSTEM "foo.dtd">
Coloreado en 0.000 segundos, usando GeSHi 1.0.8.4
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

Notapor fgalves » 2007-01-17 07:54 @371

Muchisimas gracias Explorer!!
un Saludo!!
Felipe
fgalves
Perlero nuevo
Perlero nuevo
 
Mensajes: 210
Registrado: 2006-09-25 13:54 @621

Anterior

Volver a Básico

¿Quién está conectado?

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