SlideShare una empresa de Scribd logo
pyxser,
                               Serializaci´n XML en Python
                                          o
                                         Daniel Molina Wegener
                                            dmw@coder.cl

                                          16 de octubre de 2009

                                                Resumen
          Pyxser es un proyecto FOSS desarrollado por Daniel Molina Wegener como una investi-
      gaci´n e iniciativa propias. Es una extensi´n Python 1 que utiliza las rutinas de libxml2 para
          o                                         o
      realizar tareas de serializaci´n y deserializaci´n de objetos Python. Pyxser utiliza un modelo
                                    o                 o
      de serializaci´n definido en un esquema XML2 y tambi´n en una DTD 3 . La definici´n de un
                    o                                           e                             o
      modelo de serializaci´n permite la validaci´n de la estructura del objeto serializado. El modelo
                            o                      o
      tambi´n permite empotrar objetos Python que est´n serializados en otros documentos XML,
            e                                               e
      como por ejemplo, incluir la definici´n de objetos Python dentro de un WSDL4 para utilizarlo
                                            o
      con Web Services.

      Palabras Clave Python, XML, serializaci´n, deserializaci´n, modelo, implementaci´n, C,
                                             o                o                       o
      Python C/API, XML Schema, DTD, normalizaci´n.
                                                  o


Introducci´n
          o
    Com´ nmente el modelo de serializaci´n que siguen las distintas plataformas presenta un nivel
         u                                o
de personalizaci´n demasiado alto. El proceso com´ n de serializaci´n, en lugar de buscar una
                 o                                    u                o
definici´n, crea instancias XML sin una estructura previa.
        o
    El proceso de serializaci´n en .NET, por ejemplo, crea elementos XML por cada clase, a veces
                             o
omitiendo el espacio de nombres de las clases. Esto conlleva a la necesidad de generar un esque-
ma XML por cada clase serializada o uno que los agrupe a todos, generando un alto nivel de
acoplamiento[7]. De la misma forma, los objetos serializados son dif´ ıciles de transportar entre las
diferentes plataformas.
    Pyxser en cambio, presenta un unico modelo de serializaci´n, de manera constante y con un
                                      ´                           o
nivel apropiado de cohesi´n[7], sin un acoplamiento respecto de su implementaci´n y que permite
                           o                                                        o
realizar transferencias de objetos desde un lugar a otro[2], s´lo con adoptar el esquema XML y el
                                                              o
conocimiento de las clases que se van a serializar.




  1
    Un m´dulo escrito en C utilizando la Python C/API
        o
  2
    XML Schema
  3
    Document Type Definition
  4
    Web Services Description Language
Motivaci´n
        o
      Definir un modelo de serializaci´n normalizado para objetos, que permita serializar
                                        o
      objetos de cualquier plataforma, bajo un esquema XML bien definido y entregar un
      nivel apropiado de interoperabilidad entre distintas plataformas.[6]

    Pyxser es la implementaci´n de este modelo. Se escogi´ Python como lenguaje, dada la potente
                               o                           o
capacidad de introspecci´n[9] que posee su interfaz de extensi´n en C o m´s conocida como Python
                        o                                     o          a
C/API. El modelo claramente es migrable a otros lenguajes que soporten similares caracter´ ısticas
de introspecci´n.
              o


Modelo de Serializaci´n
                     o
    El modelo de serializaci´n es simple 5 . Reune las caracter´
                             o                                 ısticas suficientes para realizar seriali-
zaciones de objetos de varios lenguajes. Esta misma simplicidad, desde el punto de vista del dise˜o  n
de la estructura, le permite ser portado y empotrado en otros documentos XML[4].
    El elemento pyxs:obj 6 se utiliza para serializar objetos. Cada objeto presenta los atributos
necesarios para su representaci´n con el adecuado soporte para referencias cruzadas y referencias
                                o
circulares. Este elemento posee 2 atributos esenciales, module y type, donde module se utiliza para
declarar el espacio de nombres y type para declarar la clase. Como identificador se utiliza el atributo
objid, el cual esta declarado como ID en la DTD y xs:ID 7 en el esquema XML.
  <x s : e l e m e n t name=” o b j ”>
    <xs:complexType>
         <x s : c h o i c e minOccurs=”0 ” maxOccurs=”unbounded ”>
             <x s : e l e m e n t r e f=”prop ”/>
             <x s : e l e m e n t r e f=” c o l ”/>
             <x s : e l e m e n t r e f=”o b j ”/>
         </ x s : c h o i c e>
         < x s : a t t r i b u t e name=” v e r s i o n ” default=” 1 . 0 ”>
             <x s : s i m p l e T y p e>
                 < x s : r e s t r i c t i o n b a s e=” x s : s t r i n g ”>
                    <x s : e n u m e r a t i o n v a l u e=” 1 . 0 ”/>
                 </ x s : r e s t r i c t i o n>
             </ x s : s i m p l e T y p e>
         </ x s : a t t r i b u t e>
         < x s : a t t r i b u t e name=” o b j i d ” type=” x s : I D ”/>
         < x s : a t t r i b u t e name=” o b j r e f ” type=”xs:IDREF ”/>
         < x s : a t t r i b u t e name=”type ” type=”xs:NMTOKEN”/>
         < x s : a t t r i b u t e name=”name ” type=”xs:NMTOKEN”/>
         < x s : a t t r i b u t e name=”module ” type=”xs:NMTOKEN”/>
         < x s : a t t r i b u t e name=” s i z e ” type=”xs:NMTOKEN”/>
    </ xs:complexType>
  </ x s : e l e m e n t>

                                         Listing 1: Definici´n del Objeto
                                                           o
  5
    K.I.S.S.
  6
    Con el namespace pyxs [3] referente a http://projects.coder.cl/pyxser/model/
  7
    xs: es el espacio de nombres para los esquemas XML, http://www.w3.org/2001/XMLSchema




                                                            2
Cuando un objeto ya se encuentra serializado y se encuentra la misma referencia en el ´rbol de
                                                                                               a
objetos o el caso de una referencia circular, se vuelve a crear un instancia del elemento pyxs:obj [8],
con la diferencia de que no agrupa subelementos, y presenta el atributo objref para referenciar al
objeto ya serializado. Este atributo esta declarado como IDREF en la DTD y como xs:IDREF [1]
en el esquema XML. Lo mismo ocurre con las referencias cruzadas, si un objeto ya se encuentra
serializado, se crea una referencia al objeto de la misma forma. Se mantiene type y module por una
cuesti´n de integridad, pero no se hace uso de estos de manera concreta.
       o
    Para los tipos primitivos o b´sicos, como enteros y cadenas, se utilizan elementos pyxs:prop. El
                                  a
elemento pyxs:prop, presenta el atributo type para declarar el tipo y el atributo size para el tama˜ o.
                                                                                                   n
Tambi´n presenta el atributo name para declarar el nombre de la propiedad.
        e
  <x s : e l e m e n t name=”prop ”>
    <xs:complexType mixed=” t r u e ”>
         < x s : a t t r i b u t e name=”type ” u s e=” r e q u i r e d ” type=”xs:NMTOKEN”/>
         < x s : a t t r i b u t e name=”name ” type=”xs:NMTOKEN”/>
         < x s : a t t r i b u t e name=” s i z e ” type=”xs:NMTOKEN”/>
         < x s : a t t r i b u t e name=”compress ”>
             <x s : s i m p l e T y p e>
                 < x s : r e s t r i c t i o n b a s e=” x s : t o k e n ”>
                    <x s : e n u m e r a t i o n v a l u e=” y e s ”/>
                    <x s : e n u m e r a t i o n v a l u e=”no ”/>
                 </ x s : r e s t r i c t i o n>
             </ x s : s i m p l e T y p e>
         </ x s : a t t r i b u t e>
         < x s : a t t r i b u t e name=”e n c o d i n g ”>
    <x s : s i m p l e T y p e>
         < x s : r e s t r i c t i o n b a s e=” x s : t o k e n ”>
             <x s : e n u m e r a t i o n v a l u e=” a s c i i ”/>
             <x s : e n u m e r a t i o n v a l u e=”b a s e 6 4 ”/>
         </ x s : r e s t r i c t i o n>
    </ x s : s i m p l e T y p e>
         </ x s : a t t r i b u t e>
    </ xs:complexType>
  </ x s : e l e m e n t>

                                   Listing 2: Definici´n de las Propiedades
                                                     o
    Para declarar las colecciones — y debido a que no siempre las colecciones son clases propiamente
tal — se cre´ el elemento pyxs:col, el cual tambi´n presenta los atributos type y name. El tama˜ o de
            o                                    e                                             n
la colecci´n se da por la cantidad de subelementos que esta posea, en lugar de utilizar un atributo
          o
size o length.
  <x s : e l e m e n t name=” c o l ”>
    <xs:complexType>
         <x s : c h o i c e minOccurs=”0 ” maxOccurs=”unbounded ”>
             <x s : e l e m e n t r e f=”prop ”/>
             <x s : e l e m e n t r e f=” c o l ”/>
             <x s : e l e m e n t r e f=”o b j ”/>
         </ x s : c h o i c e>
         < x s : a t t r i b u t e name=”type ” u s e=” r e q u i r e d ” type=”xs:NMTOKEN”/>
         < x s : a t t r i b u t e name=”name ” u s e=” r e q u i r e d ” type=”xs:NMTOKEN”/>
    </ xs:complexType>
  </ x s : e l e m e n t>

                                   Listing 3: Definici´n de las Colecciones
                                                     o


                                                          3
El modelo es recursivo, ya que puede reunir objetos bajo el elemento pyxs:obj o pyxs:col.
    El modelo, globalmente, presenta una serie de ventajas respecto de otros modelos de seriali-
zaci´n. Este es reutilizable, importable y reimplementable en otros lenguajes que soporten DOM,
    o
permitiendo crear objetos en runtime utilizando m´todos DOM est´ndar, sin caer en elementos
                                                    e                a
propietarios de este tipo de API. Tambi´n se pueden generar las clases necesarias para trabajar con
                                        e
el modelo bajo APIs externas a Python, como por ejemplo JAXB en Java.




                                  Figura 1: Modelo de Serializaci´n
                                                                 o



Reutilizaci´n del Modelo
           o
    El modelo al estar representado bajo la forma de DTD 8 y esquema XML9 es reutilizable en otras
plataformas. Por ejemplo bajo Java se pueden generar los XML Beans necesarios para interactuar
con este o bien replicar la serializaci´n bajo las caracter´
                                       o                   ısticas de introspecci´n que posee Java. Sin
                                                                                 o
embargo, Java, a diferencia de Python carece de constructores crudos por medio de introspecci´n      o
y requiere que sea declarado un constructor de firma sin par´metros.
                                                                 a
  8
      Document Type Definition
  9
      XML Schema




                                                  4
Otro caso particular, podr´ ser PHP, el cual carece de espacios de nombres y una estructura
                               ıa
ordenada de carga de clases — se puede cargar una clase desde cualquier parte del sistema.
    Sin embargo, Python podr´ recibir objetos serializados bajo este modelo y reconvertirlos en un
                              ıa
objeto concreto respecto de su clase original sin problemas respecto de su uso. Java posibilita la
creaci´n de objetos mock — imitaciones de clases reales — utilizando introspecci´n, pero es sabido
       o                                                                          o
que Java posee bajo rendimiento en su implementaci´n de introspecci´n pura desde Java. Es posible
                                                     o                o
que una implementaci´n con JNI 10 sea m´s r´pida11 . Aun as´ JNI carece de constructores crudos[5].
                      o                  a a                ı
    El modelo de serializaci´n, al estar representado por un unico esquema XML, sin instancias
                            o                                  ´
espec´ıficas para cada objeto que sea serializado, permite reutilizar el modelo en otros documentos
XML. De esta forma, es posible incluir el documento dentro de otros esquemas, por ejemplo:
<w s d l : t y p e s>
     <xsd:schema targetNamespace=” h t t p : //www. example . o r g / H e l l o / ”
               x m l n s : s o a p=” h t t p : // schemas . xmlsoap . o r g / wsdl / soap / ”
               x m l n s : t n s=” h t t p : //www. example . o r g / H e l l o / ”
               x m l n s : w s d l=” h t t p : // schemas . xmlsoap . o r g / wsdl / ”
               x m l n s : x s d=” h t t p : //www. w3 . o r g /2001/XMLSchema ”
               x m l n s : p y x s=” h t t p : // p r o j e c t s . c o d e r . c l / p y x s e r / model / ”>
               <x s d : i m p o r t
                      namespace=” h t t p : // p r o j e c t s . c o d e r . c l / p y x s e r / model / ”
                      schemaLocation=”pyxser − 1 . 0 . xsd ” />
               <x s d : e l e m e n t name=” o b j ” />
     </ xsd:schema>
</ w s d l : t y p e s>

                                              Listing 4: Ejemplo dentro de WSDL
     Dentro de una especificaci´n WSDL, permite hacer uso de los objetos serializados como si fuesen
                                o
parte del servicio y tipifcar directamente los objetos a serializar, evitando el uso de clases espec´
                                                                                                    ıficas
[6].
     Sin embargo, esto no permite crear por si sola una instancia XML que efectivamente represente
el objeto. Es necesario conocer la clase en s´ por lo que se debe generar el algoritmo apropiado en
                                              ı,
otros lenguajes para comunicar el mensaje con la reprsentaci´n exacta que se desea.
                                                                  o
     Otro detalle importante, m´s referente a la implementaci´n, es que se debe serializar un objeto
                                  a                              o
dandole prioridad a los objetos. Esto implica que se deben serializar los objetos primero, para evitar
la perdida de datos a momento de encontrar referencias cruzadas o circulares. Esto permite que el
algoritmo sea O(n) en lugar de ser O(n2 ), dado el doble recorrido que se debe realizar para verificar
las referencias a objetos. Tambi´n, en efecto, se reduce la serializaci´n de O(n) a O(log n) a medida
                                   e                                    o
que incrementan las referencias.


Referencias
[1] Paul V. Biron and Ashok Malhotra. Xml schema part 2: Datatypes second edition. World Wide
    Web Consortium, Recommendation REC-xmlschema-2-20041028, October 2004.
[2] T. Bray, J. Paoli, C. M. Sperberg-McQueen, E. Maler, and F. Yergeau. Extensible Markup
    Language (XML) 1.0 (Third Edition), W3C Recommendation 04 February 2004. The World
    Wide Web Consortium, 2004.
   10
        Java Native Interface
   11
        Sun recomienda no usar introspecci´n via java.lang.reflect en entornos de producci´n
                                          o                                              o


                                                                         5
[3] Tim Bray, Dave Hollander, Andrew Layman, and Richard Tobin. Namespaces in xml 1.0 (second
    edition). World Wide Web Consortium, Recommendation REC-xml-names-20060816, August
    2006.

[4] David C. Fallside and Priscilla Walmsley. XML Schema Part 0: Primer Second Edition, W3C
    Recommendation 28 October 2004. The World Wide Web Consortium, 2006.

[5] Sheng Liang. Java Native Interface: Programmer’s Guide and Reference. Addison-Wesley
    Longman Publishing Co., Inc., Boston, MA, USA., 1999.

[6] Ian Piumarta and Alessandro Warth. Open, reusable object models. Technical Report VPRI
    Research Note RN 2006-003-a, 2006.

[7] Diomidis Spinellis and Georgios Gousios. Beautiful Architecture: Leading Thinkers Reveal the
    Hidden Beauty in Software Design. O’Reilly Media, Inc., January 2009.

[8] Henry S. Thompson, David Beech, Murray Maloney, and Noah Mendelsohn. Xml schema part
    1: Structures second edition. World Wide Web Consortium, Recommendation REC-xmlschema-
    1-20041028, October 2004.

[9] Guido van Rossum. Python/C API Reference Manual. Python Software Foundation, 2.5 edition,
    Septiembre 2006.




                                               6

Más contenido relacionado

La actualidad más candente

7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncrona7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncrona
Laura Folgado Galache
 
XSLT y XPATH
XSLT y XPATHXSLT y XPATH
Java persistence
Java persistenceJava persistence
Java persistence
cabraval
 
XPath
XPathXPath
Semana 1 Estructuras de Control en Java
Semana 1   Estructuras de Control en JavaSemana 1   Estructuras de Control en Java
Semana 1 Estructuras de Control en Java
Richard Eliseo Mendoza Gafaro
 
Chuleta de DTD
Chuleta de DTDChuleta de DTD
Chuleta de DTD
Abrirllave
 
Estructura de datos Pilas, Colas y Listas.
Estructura de datos Pilas, Colas y Listas.Estructura de datos Pilas, Colas y Listas.
Estructura de datos Pilas, Colas y Listas.
christgch
 
Primeros pasos con neo4j
Primeros pasos con neo4jPrimeros pasos con neo4j
Primeros pasos con neo4j
Ubaldo Taladriz
 
Semana 6 Módulos en Python Entrega 2
Semana 6   Módulos en Python Entrega 2Semana 6   Módulos en Python Entrega 2
Semana 6 Módulos en Python Entrega 2
Richard Eliseo Mendoza Gafaro
 
Net1 oop vbnet
Net1 oop vbnetNet1 oop vbnet
Net1 oop vbnet
jhordy2000
 
Practica colas (if, else)
Practica colas (if, else)Practica colas (if, else)
Practica colas (if, else)
Eli Diaz
 
2.android java
2.android   java2.android   java
2.android java
guidotic
 
Semana 1 Estructuras de Datos en Java
Semana 1   Estructuras de Datos en JavaSemana 1   Estructuras de Datos en Java
Semana 1 Estructuras de Datos en Java
Richard Eliseo Mendoza Gafaro
 

La actualidad más candente (13)

7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncrona7. Utilización de mecanismos de comunicación asíncrona
7. Utilización de mecanismos de comunicación asíncrona
 
XSLT y XPATH
XSLT y XPATHXSLT y XPATH
XSLT y XPATH
 
Java persistence
Java persistenceJava persistence
Java persistence
 
XPath
XPathXPath
XPath
 
Semana 1 Estructuras de Control en Java
Semana 1   Estructuras de Control en JavaSemana 1   Estructuras de Control en Java
Semana 1 Estructuras de Control en Java
 
Chuleta de DTD
Chuleta de DTDChuleta de DTD
Chuleta de DTD
 
Estructura de datos Pilas, Colas y Listas.
Estructura de datos Pilas, Colas y Listas.Estructura de datos Pilas, Colas y Listas.
Estructura de datos Pilas, Colas y Listas.
 
Primeros pasos con neo4j
Primeros pasos con neo4jPrimeros pasos con neo4j
Primeros pasos con neo4j
 
Semana 6 Módulos en Python Entrega 2
Semana 6   Módulos en Python Entrega 2Semana 6   Módulos en Python Entrega 2
Semana 6 Módulos en Python Entrega 2
 
Net1 oop vbnet
Net1 oop vbnetNet1 oop vbnet
Net1 oop vbnet
 
Practica colas (if, else)
Practica colas (if, else)Practica colas (if, else)
Practica colas (if, else)
 
2.android java
2.android   java2.android   java
2.android java
 
Semana 1 Estructuras de Datos en Java
Semana 1   Estructuras de Datos en JavaSemana 1   Estructuras de Datos en Java
Semana 1 Estructuras de Datos en Java
 

Destacado

Diario Oficial de la Federación Anexo20 Resolución Miscelánea Fiscal 2014
Diario Oficial de la Federación Anexo20 Resolución Miscelánea Fiscal 2014Diario Oficial de la Federación Anexo20 Resolución Miscelánea Fiscal 2014
Diario Oficial de la Federación Anexo20 Resolución Miscelánea Fiscal 2014
ahtreb57
 
Web3y4
Web3y4Web3y4
Web3y4
edbater
 
Almdedat
AlmdedatAlmdedat
Almdedat
Sujey Morales
 
Nu soap
Nu soapNu soap
Wsdl concepto
Wsdl conceptoWsdl concepto
Wsdl concepto
Jhampiers Saint
 
Ejercicio - Personal de departamentos (XSD - XML Schema)
Ejercicio - Personal de departamentos (XSD - XML Schema)Ejercicio - Personal de departamentos (XSD - XML Schema)
Ejercicio - Personal de departamentos (XSD - XML Schema)
Abrirllave
 
Rdf
RdfRdf
Introducción a XML Schema
Introducción a XML SchemaIntroducción a XML Schema
Introducción a XML Schema
Jose Emilio Labra Gayo
 
Contenidos detallados del tutorial de LMSGI
Contenidos detallados del tutorial de LMSGIContenidos detallados del tutorial de LMSGI
Contenidos detallados del tutorial de LMSGI
Abrirllave
 

Destacado (9)

Diario Oficial de la Federación Anexo20 Resolución Miscelánea Fiscal 2014
Diario Oficial de la Federación Anexo20 Resolución Miscelánea Fiscal 2014Diario Oficial de la Federación Anexo20 Resolución Miscelánea Fiscal 2014
Diario Oficial de la Federación Anexo20 Resolución Miscelánea Fiscal 2014
 
Web3y4
Web3y4Web3y4
Web3y4
 
Almdedat
AlmdedatAlmdedat
Almdedat
 
Nu soap
Nu soapNu soap
Nu soap
 
Wsdl concepto
Wsdl conceptoWsdl concepto
Wsdl concepto
 
Ejercicio - Personal de departamentos (XSD - XML Schema)
Ejercicio - Personal de departamentos (XSD - XML Schema)Ejercicio - Personal de departamentos (XSD - XML Schema)
Ejercicio - Personal de departamentos (XSD - XML Schema)
 
Rdf
RdfRdf
Rdf
 
Introducción a XML Schema
Introducción a XML SchemaIntroducción a XML Schema
Introducción a XML Schema
 
Contenidos detallados del tutorial de LMSGI
Contenidos detallados del tutorial de LMSGIContenidos detallados del tutorial de LMSGI
Contenidos detallados del tutorial de LMSGI
 

Similar a Pyxser, Serialización XML en Python (paper)

Datos En La Web - Clase 2
Datos En La Web - Clase 2Datos En La Web - Clase 2
Datos En La Web - Clase 2
Sebastian Galiano
 
Capitulo 27 (XML: Lenguaje de mercado extendible) y Capítulo 28 (Conceptos de...
Capitulo 27 (XML: Lenguaje de mercado extendible) y Capítulo 28 (Conceptos de...Capitulo 27 (XML: Lenguaje de mercado extendible) y Capítulo 28 (Conceptos de...
Capitulo 27 (XML: Lenguaje de mercado extendible) y Capítulo 28 (Conceptos de...
Liz Ocampo
 
Procesamiento de XML en C#
Procesamiento de XML en C#Procesamiento de XML en C#
Procesamiento de XML en C#
Jordan-P
 
5/9 Curso JEE5, Soa, Web Services, ESB y XML
5/9 Curso JEE5, Soa, Web Services, ESB y XML5/9 Curso JEE5, Soa, Web Services, ESB y XML
5/9 Curso JEE5, Soa, Web Services, ESB y XML
Juan Carlos Rubio Pineda
 
Base De Datos Orientados A Objetos
Base De Datos Orientados A ObjetosBase De Datos Orientados A Objetos
Base De Datos Orientados A Objetos
María Eugenia
 
OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)
OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)
OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)
Oscar V
 
Arquitectura N-Capas y ADo.NET
Arquitectura N-Capas y ADo.NETArquitectura N-Capas y ADo.NET
Arquitectura N-Capas y ADo.NET
Roberto Taborda
 
U7 1 xslt-curso2018-19
U7 1 xslt-curso2018-19U7 1 xslt-curso2018-19
U7 1 xslt-curso2018-19
Juan José Taboada León
 
U7 1 xslt-curso2017-18
U7 1 xslt-curso2017-18U7 1 xslt-curso2017-18
U7 1 xslt-curso2017-18
Juan José Taboada León
 
Programacion orientada a objetos
Programacion orientada a objetosProgramacion orientada a objetos
Programacion orientada a objetos
xiomaracadenag
 
Lenguajes de marcado
Lenguajes de marcadoLenguajes de marcado
Lenguajes de marcado
Jesús Tramullas
 
Edición Digital: Lenguajes de marcado
Edición Digital: Lenguajes de marcadoEdición Digital: Lenguajes de marcado
Edición Digital: Lenguajes de marcado
Jesús Tramullas
 
Tema 3 xml processing ap is
Tema 3   xml processing ap isTema 3   xml processing ap is
Tema 3 xml processing ap is
xkorpium
 
Programación II_modulo1lolololololo9oo.pptx
Programación II_modulo1lolololololo9oo.pptxProgramación II_modulo1lolololololo9oo.pptx
Programación II_modulo1lolololololo9oo.pptx
hassanbadredun
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)
Ronald Cuello
 
Frameworks de templates y xml
Frameworks de templates y xmlFrameworks de templates y xml
Frameworks de templates y xml
roger gustavo saravia aramayo
 
Integración de aplicaciones Java
Integración de aplicaciones JavaIntegración de aplicaciones Java
Integración de aplicaciones Java
Iker Canarias
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentaciones
mary taipe
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentaciones
mary taipe
 
Base de datos-objeto-relacional
Base de datos-objeto-relacionalBase de datos-objeto-relacional
Base de datos-objeto-relacional
Eduar Alfons Leon
 

Similar a Pyxser, Serialización XML en Python (paper) (20)

Datos En La Web - Clase 2
Datos En La Web - Clase 2Datos En La Web - Clase 2
Datos En La Web - Clase 2
 
Capitulo 27 (XML: Lenguaje de mercado extendible) y Capítulo 28 (Conceptos de...
Capitulo 27 (XML: Lenguaje de mercado extendible) y Capítulo 28 (Conceptos de...Capitulo 27 (XML: Lenguaje de mercado extendible) y Capítulo 28 (Conceptos de...
Capitulo 27 (XML: Lenguaje de mercado extendible) y Capítulo 28 (Conceptos de...
 
Procesamiento de XML en C#
Procesamiento de XML en C#Procesamiento de XML en C#
Procesamiento de XML en C#
 
5/9 Curso JEE5, Soa, Web Services, ESB y XML
5/9 Curso JEE5, Soa, Web Services, ESB y XML5/9 Curso JEE5, Soa, Web Services, ESB y XML
5/9 Curso JEE5, Soa, Web Services, ESB y XML
 
Base De Datos Orientados A Objetos
Base De Datos Orientados A ObjetosBase De Datos Orientados A Objetos
Base De Datos Orientados A Objetos
 
OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)
OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)
OCP, JSE 6 Programmer (1z0-851) - Guia practica 3 de 7(ap-is)
 
Arquitectura N-Capas y ADo.NET
Arquitectura N-Capas y ADo.NETArquitectura N-Capas y ADo.NET
Arquitectura N-Capas y ADo.NET
 
U7 1 xslt-curso2018-19
U7 1 xslt-curso2018-19U7 1 xslt-curso2018-19
U7 1 xslt-curso2018-19
 
U7 1 xslt-curso2017-18
U7 1 xslt-curso2017-18U7 1 xslt-curso2017-18
U7 1 xslt-curso2017-18
 
Programacion orientada a objetos
Programacion orientada a objetosProgramacion orientada a objetos
Programacion orientada a objetos
 
Lenguajes de marcado
Lenguajes de marcadoLenguajes de marcado
Lenguajes de marcado
 
Edición Digital: Lenguajes de marcado
Edición Digital: Lenguajes de marcadoEdición Digital: Lenguajes de marcado
Edición Digital: Lenguajes de marcado
 
Tema 3 xml processing ap is
Tema 3   xml processing ap isTema 3   xml processing ap is
Tema 3 xml processing ap is
 
Programación II_modulo1lolololololo9oo.pptx
Programación II_modulo1lolololololo9oo.pptxProgramación II_modulo1lolololololo9oo.pptx
Programación II_modulo1lolololololo9oo.pptx
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)
 
Frameworks de templates y xml
Frameworks de templates y xmlFrameworks de templates y xml
Frameworks de templates y xml
 
Integración de aplicaciones Java
Integración de aplicaciones JavaIntegración de aplicaciones Java
Integración de aplicaciones Java
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentaciones
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentaciones
 
Base de datos-objeto-relacional
Base de datos-objeto-relacionalBase de datos-objeto-relacional
Base de datos-objeto-relacional
 

Pyxser, Serialización XML en Python (paper)

  • 1. pyxser, Serializaci´n XML en Python o Daniel Molina Wegener dmw@coder.cl 16 de octubre de 2009 Resumen Pyxser es un proyecto FOSS desarrollado por Daniel Molina Wegener como una investi- gaci´n e iniciativa propias. Es una extensi´n Python 1 que utiliza las rutinas de libxml2 para o o realizar tareas de serializaci´n y deserializaci´n de objetos Python. Pyxser utiliza un modelo o o de serializaci´n definido en un esquema XML2 y tambi´n en una DTD 3 . La definici´n de un o e o modelo de serializaci´n permite la validaci´n de la estructura del objeto serializado. El modelo o o tambi´n permite empotrar objetos Python que est´n serializados en otros documentos XML, e e como por ejemplo, incluir la definici´n de objetos Python dentro de un WSDL4 para utilizarlo o con Web Services. Palabras Clave Python, XML, serializaci´n, deserializaci´n, modelo, implementaci´n, C, o o o Python C/API, XML Schema, DTD, normalizaci´n. o Introducci´n o Com´ nmente el modelo de serializaci´n que siguen las distintas plataformas presenta un nivel u o de personalizaci´n demasiado alto. El proceso com´ n de serializaci´n, en lugar de buscar una o u o definici´n, crea instancias XML sin una estructura previa. o El proceso de serializaci´n en .NET, por ejemplo, crea elementos XML por cada clase, a veces o omitiendo el espacio de nombres de las clases. Esto conlleva a la necesidad de generar un esque- ma XML por cada clase serializada o uno que los agrupe a todos, generando un alto nivel de acoplamiento[7]. De la misma forma, los objetos serializados son dif´ ıciles de transportar entre las diferentes plataformas. Pyxser en cambio, presenta un unico modelo de serializaci´n, de manera constante y con un ´ o nivel apropiado de cohesi´n[7], sin un acoplamiento respecto de su implementaci´n y que permite o o realizar transferencias de objetos desde un lugar a otro[2], s´lo con adoptar el esquema XML y el o conocimiento de las clases que se van a serializar. 1 Un m´dulo escrito en C utilizando la Python C/API o 2 XML Schema 3 Document Type Definition 4 Web Services Description Language
  • 2. Motivaci´n o Definir un modelo de serializaci´n normalizado para objetos, que permita serializar o objetos de cualquier plataforma, bajo un esquema XML bien definido y entregar un nivel apropiado de interoperabilidad entre distintas plataformas.[6] Pyxser es la implementaci´n de este modelo. Se escogi´ Python como lenguaje, dada la potente o o capacidad de introspecci´n[9] que posee su interfaz de extensi´n en C o m´s conocida como Python o o a C/API. El modelo claramente es migrable a otros lenguajes que soporten similares caracter´ ısticas de introspecci´n. o Modelo de Serializaci´n o El modelo de serializaci´n es simple 5 . Reune las caracter´ o ısticas suficientes para realizar seriali- zaciones de objetos de varios lenguajes. Esta misma simplicidad, desde el punto de vista del dise˜o n de la estructura, le permite ser portado y empotrado en otros documentos XML[4]. El elemento pyxs:obj 6 se utiliza para serializar objetos. Cada objeto presenta los atributos necesarios para su representaci´n con el adecuado soporte para referencias cruzadas y referencias o circulares. Este elemento posee 2 atributos esenciales, module y type, donde module se utiliza para declarar el espacio de nombres y type para declarar la clase. Como identificador se utiliza el atributo objid, el cual esta declarado como ID en la DTD y xs:ID 7 en el esquema XML. <x s : e l e m e n t name=” o b j ”> <xs:complexType> <x s : c h o i c e minOccurs=”0 ” maxOccurs=”unbounded ”> <x s : e l e m e n t r e f=”prop ”/> <x s : e l e m e n t r e f=” c o l ”/> <x s : e l e m e n t r e f=”o b j ”/> </ x s : c h o i c e> < x s : a t t r i b u t e name=” v e r s i o n ” default=” 1 . 0 ”> <x s : s i m p l e T y p e> < x s : r e s t r i c t i o n b a s e=” x s : s t r i n g ”> <x s : e n u m e r a t i o n v a l u e=” 1 . 0 ”/> </ x s : r e s t r i c t i o n> </ x s : s i m p l e T y p e> </ x s : a t t r i b u t e> < x s : a t t r i b u t e name=” o b j i d ” type=” x s : I D ”/> < x s : a t t r i b u t e name=” o b j r e f ” type=”xs:IDREF ”/> < x s : a t t r i b u t e name=”type ” type=”xs:NMTOKEN”/> < x s : a t t r i b u t e name=”name ” type=”xs:NMTOKEN”/> < x s : a t t r i b u t e name=”module ” type=”xs:NMTOKEN”/> < x s : a t t r i b u t e name=” s i z e ” type=”xs:NMTOKEN”/> </ xs:complexType> </ x s : e l e m e n t> Listing 1: Definici´n del Objeto o 5 K.I.S.S. 6 Con el namespace pyxs [3] referente a http://projects.coder.cl/pyxser/model/ 7 xs: es el espacio de nombres para los esquemas XML, http://www.w3.org/2001/XMLSchema 2
  • 3. Cuando un objeto ya se encuentra serializado y se encuentra la misma referencia en el ´rbol de a objetos o el caso de una referencia circular, se vuelve a crear un instancia del elemento pyxs:obj [8], con la diferencia de que no agrupa subelementos, y presenta el atributo objref para referenciar al objeto ya serializado. Este atributo esta declarado como IDREF en la DTD y como xs:IDREF [1] en el esquema XML. Lo mismo ocurre con las referencias cruzadas, si un objeto ya se encuentra serializado, se crea una referencia al objeto de la misma forma. Se mantiene type y module por una cuesti´n de integridad, pero no se hace uso de estos de manera concreta. o Para los tipos primitivos o b´sicos, como enteros y cadenas, se utilizan elementos pyxs:prop. El a elemento pyxs:prop, presenta el atributo type para declarar el tipo y el atributo size para el tama˜ o. n Tambi´n presenta el atributo name para declarar el nombre de la propiedad. e <x s : e l e m e n t name=”prop ”> <xs:complexType mixed=” t r u e ”> < x s : a t t r i b u t e name=”type ” u s e=” r e q u i r e d ” type=”xs:NMTOKEN”/> < x s : a t t r i b u t e name=”name ” type=”xs:NMTOKEN”/> < x s : a t t r i b u t e name=” s i z e ” type=”xs:NMTOKEN”/> < x s : a t t r i b u t e name=”compress ”> <x s : s i m p l e T y p e> < x s : r e s t r i c t i o n b a s e=” x s : t o k e n ”> <x s : e n u m e r a t i o n v a l u e=” y e s ”/> <x s : e n u m e r a t i o n v a l u e=”no ”/> </ x s : r e s t r i c t i o n> </ x s : s i m p l e T y p e> </ x s : a t t r i b u t e> < x s : a t t r i b u t e name=”e n c o d i n g ”> <x s : s i m p l e T y p e> < x s : r e s t r i c t i o n b a s e=” x s : t o k e n ”> <x s : e n u m e r a t i o n v a l u e=” a s c i i ”/> <x s : e n u m e r a t i o n v a l u e=”b a s e 6 4 ”/> </ x s : r e s t r i c t i o n> </ x s : s i m p l e T y p e> </ x s : a t t r i b u t e> </ xs:complexType> </ x s : e l e m e n t> Listing 2: Definici´n de las Propiedades o Para declarar las colecciones — y debido a que no siempre las colecciones son clases propiamente tal — se cre´ el elemento pyxs:col, el cual tambi´n presenta los atributos type y name. El tama˜ o de o e n la colecci´n se da por la cantidad de subelementos que esta posea, en lugar de utilizar un atributo o size o length. <x s : e l e m e n t name=” c o l ”> <xs:complexType> <x s : c h o i c e minOccurs=”0 ” maxOccurs=”unbounded ”> <x s : e l e m e n t r e f=”prop ”/> <x s : e l e m e n t r e f=” c o l ”/> <x s : e l e m e n t r e f=”o b j ”/> </ x s : c h o i c e> < x s : a t t r i b u t e name=”type ” u s e=” r e q u i r e d ” type=”xs:NMTOKEN”/> < x s : a t t r i b u t e name=”name ” u s e=” r e q u i r e d ” type=”xs:NMTOKEN”/> </ xs:complexType> </ x s : e l e m e n t> Listing 3: Definici´n de las Colecciones o 3
  • 4. El modelo es recursivo, ya que puede reunir objetos bajo el elemento pyxs:obj o pyxs:col. El modelo, globalmente, presenta una serie de ventajas respecto de otros modelos de seriali- zaci´n. Este es reutilizable, importable y reimplementable en otros lenguajes que soporten DOM, o permitiendo crear objetos en runtime utilizando m´todos DOM est´ndar, sin caer en elementos e a propietarios de este tipo de API. Tambi´n se pueden generar las clases necesarias para trabajar con e el modelo bajo APIs externas a Python, como por ejemplo JAXB en Java. Figura 1: Modelo de Serializaci´n o Reutilizaci´n del Modelo o El modelo al estar representado bajo la forma de DTD 8 y esquema XML9 es reutilizable en otras plataformas. Por ejemplo bajo Java se pueden generar los XML Beans necesarios para interactuar con este o bien replicar la serializaci´n bajo las caracter´ o ısticas de introspecci´n que posee Java. Sin o embargo, Java, a diferencia de Python carece de constructores crudos por medio de introspecci´n o y requiere que sea declarado un constructor de firma sin par´metros. a 8 Document Type Definition 9 XML Schema 4
  • 5. Otro caso particular, podr´ ser PHP, el cual carece de espacios de nombres y una estructura ıa ordenada de carga de clases — se puede cargar una clase desde cualquier parte del sistema. Sin embargo, Python podr´ recibir objetos serializados bajo este modelo y reconvertirlos en un ıa objeto concreto respecto de su clase original sin problemas respecto de su uso. Java posibilita la creaci´n de objetos mock — imitaciones de clases reales — utilizando introspecci´n, pero es sabido o o que Java posee bajo rendimiento en su implementaci´n de introspecci´n pura desde Java. Es posible o o que una implementaci´n con JNI 10 sea m´s r´pida11 . Aun as´ JNI carece de constructores crudos[5]. o a a ı El modelo de serializaci´n, al estar representado por un unico esquema XML, sin instancias o ´ espec´ıficas para cada objeto que sea serializado, permite reutilizar el modelo en otros documentos XML. De esta forma, es posible incluir el documento dentro de otros esquemas, por ejemplo: <w s d l : t y p e s> <xsd:schema targetNamespace=” h t t p : //www. example . o r g / H e l l o / ” x m l n s : s o a p=” h t t p : // schemas . xmlsoap . o r g / wsdl / soap / ” x m l n s : t n s=” h t t p : //www. example . o r g / H e l l o / ” x m l n s : w s d l=” h t t p : // schemas . xmlsoap . o r g / wsdl / ” x m l n s : x s d=” h t t p : //www. w3 . o r g /2001/XMLSchema ” x m l n s : p y x s=” h t t p : // p r o j e c t s . c o d e r . c l / p y x s e r / model / ”> <x s d : i m p o r t namespace=” h t t p : // p r o j e c t s . c o d e r . c l / p y x s e r / model / ” schemaLocation=”pyxser − 1 . 0 . xsd ” /> <x s d : e l e m e n t name=” o b j ” /> </ xsd:schema> </ w s d l : t y p e s> Listing 4: Ejemplo dentro de WSDL Dentro de una especificaci´n WSDL, permite hacer uso de los objetos serializados como si fuesen o parte del servicio y tipifcar directamente los objetos a serializar, evitando el uso de clases espec´ ıficas [6]. Sin embargo, esto no permite crear por si sola una instancia XML que efectivamente represente el objeto. Es necesario conocer la clase en s´ por lo que se debe generar el algoritmo apropiado en ı, otros lenguajes para comunicar el mensaje con la reprsentaci´n exacta que se desea. o Otro detalle importante, m´s referente a la implementaci´n, es que se debe serializar un objeto a o dandole prioridad a los objetos. Esto implica que se deben serializar los objetos primero, para evitar la perdida de datos a momento de encontrar referencias cruzadas o circulares. Esto permite que el algoritmo sea O(n) en lugar de ser O(n2 ), dado el doble recorrido que se debe realizar para verificar las referencias a objetos. Tambi´n, en efecto, se reduce la serializaci´n de O(n) a O(log n) a medida e o que incrementan las referencias. Referencias [1] Paul V. Biron and Ashok Malhotra. Xml schema part 2: Datatypes second edition. World Wide Web Consortium, Recommendation REC-xmlschema-2-20041028, October 2004. [2] T. Bray, J. Paoli, C. M. Sperberg-McQueen, E. Maler, and F. Yergeau. Extensible Markup Language (XML) 1.0 (Third Edition), W3C Recommendation 04 February 2004. The World Wide Web Consortium, 2004. 10 Java Native Interface 11 Sun recomienda no usar introspecci´n via java.lang.reflect en entornos de producci´n o o 5
  • 6. [3] Tim Bray, Dave Hollander, Andrew Layman, and Richard Tobin. Namespaces in xml 1.0 (second edition). World Wide Web Consortium, Recommendation REC-xml-names-20060816, August 2006. [4] David C. Fallside and Priscilla Walmsley. XML Schema Part 0: Primer Second Edition, W3C Recommendation 28 October 2004. The World Wide Web Consortium, 2006. [5] Sheng Liang. Java Native Interface: Programmer’s Guide and Reference. Addison-Wesley Longman Publishing Co., Inc., Boston, MA, USA., 1999. [6] Ian Piumarta and Alessandro Warth. Open, reusable object models. Technical Report VPRI Research Note RN 2006-003-a, 2006. [7] Diomidis Spinellis and Georgios Gousios. Beautiful Architecture: Leading Thinkers Reveal the Hidden Beauty in Software Design. O’Reilly Media, Inc., January 2009. [8] Henry S. Thompson, David Beech, Murray Maloney, and Noah Mendelsohn. Xml schema part 1: Structures second edition. World Wide Web Consortium, Recommendation REC-xmlschema- 1-20041028, October 2004. [9] Guido van Rossum. Python/C API Reference Manual. Python Software Foundation, 2.5 edition, Septiembre 2006. 6