• Publicidad

Comparar documento con plantilla XML

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

Comparar documento con plantilla XML

Notapor vicca » 2012-04-16 03:49 @200

¡Hola!

Estoy intentando comparar un documento con una plantilla XML predefinida utilizando Perl.
Soy un poco novato con este lenguaje así que me gustaría que me recomendasen cómo hacerlo.
Había pensado en utilizar expresiones regulares, pero lo veo demasiado complicado.
¿Habría alguna forma de hacerlo más sencilla?

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

Publicidad

Re: Comparar documento con plantilla XML

Notapor explorer » 2012-04-16 04:21 @223

Bienvenido a los foros de Perl en Español, vicca.

¿Podrías poner un ejemplo -corto o un extracto- de lo que quieres hacer?
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

Re: Comparar documento con plantilla XML

Notapor vicca » 2012-04-18 06:39 @319

¡Hola!

Explico un poco más la situación: como datos de un programa interno, el usuario tiene que generar una descripción en lenguaje XML. Yo lo que quiero es comprobar que la semántica de lo que escribe el usuario es correcta.

Por ejemplo, lo escrito en una rama concreta tiene que ser una opción de las permitidas (dependiendo de en qué rama sea...). Y todas esas restricciones vienen expresadas en una especie de plantilla XML.

No sé si me he explicado bien... Aún así, en un par de días intento poner un ejemplo ya realista de la situación.

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

Re: Comparar documento con plantilla XML

Notapor explorer » 2012-04-18 10:49 @492

Una solución para lo que quieres es: definir la plantilla con XSD, y luego, con el módulo XML::Validator::Schema, validar si el XML es conforme a ese XSD.

Por ejemplo, tenemos esta plantilla:
Sintáxis: [ Descargar ] [ Ocultar ]
Using xml Syntax Highlighting
  1. <?xml version="1.0" ?>
  2. <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
  3.     <xsd:element name="elementname">
  4.         <xsd:complexType>
  5.             <xsd:sequence>
  6.                 <xsd:element name="field1" type="xsd:integer" minOccurs="0" maxOccurs="1"/>
  7.                 <xsd:element name="field2" type="xsd:string" minOccurs="0" maxOccurs="1"/>
  8.             </xsd:sequence>
  9.         </xsd:complexType>
  10.     </xsd:element>
  11. </xsd:schema>
  12.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Entonces se puede crear un programa que valide el xml:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use XML::SAX::ParserFactory;
  2. use XML::Validator::Schema;
  3.  
  4. $validator = XML::Validator::Schema->new(file => 'foo.xsd');
  5. $parser    = XML::SAX::ParserFactory->parser(Handler => $validator);
  6. eval { $parser->parse_uri('foo.xml') };
  7. die "File failed validation: $@" if $@
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4


También se puede hacer con la biblioteca LibXML:
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4.  
  5. use XML::LibXML;
  6.  
  7. my $xml = 'Export.xml';
  8. my $xsd = 'export.xsd';
  9.  
  10. if ( my $error = validate_xml_against_xsd($xml, $xsd) ) {
  11.     die "Validation failed: $error\n";
  12. }
  13.  
  14. sub validate_xml_against_xsd {
  15.     my ($xml, $xsd) = @_;
  16.  
  17.     my $schema = XML::LibXML::Schema->new(location => $xsd);
  18.     my $parser = XML::LibXML->new;
  19.  
  20.     my $doc = $parser->parse_file($xml);
  21.     eval { $schema->validate( $doc ) };
  22.  
  23.     if ( my $ex = $@ ) {
  24.         return $ex;
  25.     }
  26.     return;
  27. }
  28.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Y una vez validado, sacar la información con XML::DOM.

Sacado de aquí y aquí.
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

Re: Comparar documento con plantilla XML

Notapor vicca » 2012-04-19 13:48 @616

Muchas gracias.

Con esto creo que consigo solucionar una parte del problema, pero no todo.

Me explico: también me gustaría restringir los valores que pueden tomar los atributos y creo que eso no se puede hacer con el XML Schema.

Pongo un ejemplo:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. <vm name="r1" type="quagga" subtype="lib-install">
  2.   <hostname>r1</hostname>
  3.   <password>xxxx</password>
  4.   <network area="0.0.0.0">10.0.0.0/16</network>
  5.   <passive_if>eth1</passive_if>
  6.   <binaries>
  7.     <zebra>/usr/lib/quagga/zebra</zebra>
  8.     <ospfd>/usr/lib/quagga/ospfd</ospfd>
  9.   </binaries>
  10. </vm>
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Por ejemplo, para el elemento "r1", me gustaría que el tipo sólo pudiese tomar como valor "quagga", "libvirt" o "uml".

¿Cómo podría hacerlo?

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

Re: Comparar documento con plantilla XML

Notapor explorer » 2012-04-19 13:53 @620

Yo no soy un experto en XSD, pero consultando su página de la Wikipedia, dice que con 'restriction' se pueden restringir los valores que puede usar.
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

Re: Comparar documento con plantilla XML

Notapor vicca » 2012-04-23 06:18 @304

Lo he estado mirando y me sirve bastante.
Sólo quedan un par de cosillas por retocar y darle vueltas a ver cómo lo soluciono.

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


Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 16 invitados