Procesamiento de XML en Python

votos
61

Estoy a punto de construir una parte de un proyecto que necesitará construir y publicar un documento XML en un servicio web y me gustaría hacerlo en Python, como un medio para expandir mis habilidades en él.

Desafortunadamente, aunque conozco bastante bien el modelo XML en .NET, no estoy seguro de cuáles son los pros y los contras de los modelos XML en Python.

¿Alguien tiene experiencia haciendo procesamiento XML en Python? ¿Dónde sugieres que empiece? Los archivos XML que construiré serán bastante simples.

Publicado el 02/08/2008 a las 04:35
fuente por usuario
En otros idiomas...                            


16 respuestas

votos
6

Dive Into Python tiene un capítulo. No puedo asegurar lo bueno que sería.

Respondida el 02/08/2008 a las 04:43
fuente por usuario

votos
22

Personalmente, jugué con varias de las opciones incorporadas en un proyecto con gran cantidad de XML y me he decidido por pulldom como la mejor opción para documentos menos complejos.

Especialmente para pequeñas cosas simples, me gusta la teoría de análisis basada en eventos en lugar de establecer una gran cantidad de devoluciones de llamada para una estructura relativamente simple. Aquí hay una buena discusión rápida sobre cómo usar la API .

Lo que me gusta: puedes manejar el análisis en un forbucle en lugar de usar devoluciones de llamada. También demoras el análisis completo (la parte "pull") y solo obtienes detalles adicionales cuando llamas expandNode(). Esto satisface mis requerimientos generales de eficiencia "responsable" sin sacrificar la facilidad de uso y la simplicidad.

Respondida el 02/08/2008 a las 05:01
fuente por usuario

votos
30

ElementTree tiene una buena API pythony. Creo que incluso se envía como parte de Python 2.5

Está en python puro y, como digo, muy bonito, pero si terminas necesitando más rendimiento, lxml expone la misma API y usa libxml2 bajo el capó. En teoría, puede cambiarlo cuando descubra que lo necesita.

Respondida el 02/08/2008 a las 16:21
fuente por usuario

votos
3

Como mencionó que construirá XML "bastante simple", es probable que el módulo minidom (parte de la Biblioteca estándar de Python) se adapte a sus necesidades. Si tiene alguna experiencia con la representación DOM de XML, debería encontrar la API bastante directa.

Respondida el 02/08/2008 a las 19:04
fuente por usuario

votos
4

Escribo un servidor SOAP que recibe solicitudes XML y crea respuestas XML. (Lamentablemente, no es mi proyecto, por lo que es de código cerrado, pero ese es otro problema).

Resultó que la creación de documentos XML (SOAP) es bastante simple, si tiene una estructura de datos que "se ajusta" al esquema.

Guardo el sobre, ya que el sobre de respuesta es (casi) el mismo que el sobre de la solicitud. Entonces, dado que mi estructura de datos es un diccionario (posiblemente anidado), creo una cadena que convierte este diccionario en elementos de <clave> valor </ key>.

Esta es una tarea que la recursión hace simple, y termino con la estructura correcta. Todo esto se hace en código python, y actualmente es lo suficientemente rápido para el uso de producción.

También puede (relativamente) crear fácilmente listas, aunque dependiendo de su cliente, puede tener problemas a menos que proporcione pistas de longitud.

Para mí, esto fue mucho más simple, ya que un diccionario es una forma mucho más fácil de trabajar que algunas clases personalizadas. Para los libros, ¡la generación de XML es mucho más fácil que el análisis!

Respondida el 03/08/2008 a las 09:34
fuente por usuario

votos
3

Personalmente creo que ese capítulo de Dive into Python es genial. Verifique primero: utiliza el módulo minidom y es una buena pieza de escritura.

Respondida el 11/08/2008 a las 19:02
fuente por usuario

votos
1

Recientemente comencé a usar Amara con éxito.

Respondida el 11/08/2008 a las 23:40
fuente por usuario

votos
5

Hay tres formas principales de tratar con XML, en general: dom, sax y xpath. El modelo dom es bueno si puede permitirse cargar todo su archivo xml en la memoria a la vez, y no le importa tratar con estructuras de datos, y está mirando la mayor parte del modelo. El modelo de sax es genial si solo le importan unas pocas etiquetas, y / o si está tratando con archivos grandes y puede procesarlos secuencialmente. El modelo xpath es un poco de cada uno: puede seleccionar y elegir rutas a los elementos de datos que necesita, pero requiere más bibliotecas para usar.

Si quieres algo sencillo y empaquetado con Python, minidom es tu respuesta, pero es bastante cojo, y la documentación es "aquí hay documentos sobre dom, ve a resolverlo". Es muy molesto.

Personalmente, me gusta cElementTree, que es una implementación más rápida (basada en c) de ElementTree, que es un modelo dom-like.

He usado sistemas de saxofón, y en muchos sentidos son más "pitónicos" en su sentir, pero generalmente termino creando sistemas basados ​​en el estado para manejarlos, y de esa manera se encuentra la locura (y los errores).

Digo ir con minidom si te gusta la investigación, o ElementTree si quieres un buen código que funcione bien.

Respondida el 16/09/2008 a las 05:35
fuente por usuario

votos
1

Supongo que la .Net-way de procesamiento XML se basa en una versión de MSXML y en ese caso asumo que usar por ejemplo minidom te haría sentir como en casa. Sin embargo, si se trata de un procesamiento simple, lo que está haciendo es probable que lo haga cualquier biblioteca.

Yo también prefiero trabajar con ElementTree cuando se trata de xml en Python, es una biblioteca muy ordenada.

Respondida el 16/09/2008 a las 07:20
fuente por usuario

votos
5

He usado ElementTree para varios proyectos y lo recomiendo.

Es pitónico, viene 'en la caja' con Python 2.5, incluida la versión c cElementTree (xml.etree.cElementTree), que es 20 veces más rápido que la versión pura de Python, y es muy fácil de usar.

lxml tiene algunas ventajas de rendimiento, pero son desiguales y usted debe verificar los puntos de referencia primero para su caso de uso.

Según tengo entendido, el código de ElementTree se puede portar fácilmente a lxml.

Respondida el 23/09/2008 a las 20:42
fuente por usuario

votos
1

Si vas a crear mensajes SOAP, echa un vistazo a soaplib . Utiliza ElementTree bajo el capó, pero proporciona una interfaz mucho más limpia para serializar y deserializar mensajes.

Respondida el 13/10/2008 a las 23:17
fuente por usuario

votos
5

Depende un poco de qué tan complicado debe ser el documento.

He usado mucho minidom para escribir XML, pero por lo general solo he estado leyendo documentos, haciendo algunas transformaciones simples y escribiéndolas de nuevo. Eso funcionó bastante bien hasta que necesité la capacidad de ordenar atributos de elementos (para satisfacer una aplicación antigua que no analiza XML correctamente). En ese momento, me rendí y escribí el XML yo mismo.

Si solo trabajas en documentos simples, hacerlo tú mismo puede ser más rápido y sencillo que aprender un framework. Si puede concebiblemente escribir el XML a mano, entonces probablemente también pueda codificarlo a mano (solo recuerde escaparse apropiadamente de caracteres especiales, y usarlo str.encode(codec, errors="xmlcharrefreplace")). Además de estos errores, XML es lo suficientemente regular como para que no necesite una biblioteca especial para escribirlo. Si el documento es demasiado complicado para escribirlo a mano, entonces probablemente deba examinar uno de los marcos ya mencionados. En ningún momento debería necesitar escribir un escritor XML general.

Respondida el 14/10/2008 a las 19:26
fuente por usuario

votos
4

También puede tratar de desenredar a analizar documentos XML muy simples.

Respondida el 31/10/2011 a las 15:05
fuente por usuario

votos
1

Recomiendo SAX - API simple para XML - aplicación en las bibliotecas de Python. Ellos son bastante fáciles de instalar y procesar grandes XML API incluso impulsado, como se comenta por críticos anteriores aquí, y tienen una baja huella de memoria a diferencia de validación de DOM analizadores XML estilo.

Respondida el 12/12/2012 a las 04:25
fuente por usuario

votos
3

Para el trabajo serio con XML en Python uso lxml

Python viene con elementtree incorporado en la biblioteca, pero lxml se extiende en términos de velocidad y funcionalidad (validación de esquemas, análisis saxofón, XPath, varios tipos de iteradores y muchas otras características).

Usted tiene que instalarlo, pero en muchos lugares ya se supone que es parte del equipo estándar (por ejemplo, Google App Engine no permite que los paquetes de Python basadas en C, pero hace una excepción para lxml, PyYAML y algunos otros).

La construcción de documentos XML con E-fábrica (de lxml)

Su pregunta es sobre la construcción de documento XML.

Con lxml hay muchos métodos y me tomó un tiempo para encontrar el uno, que parece ser fácil de usar y también fácil de leer.

El código de ejemplo de doc lxml sobre el uso de E-fábrica (ligeramente simplificado):


El E-fábrica proporciona una sintaxis simple y compacto para la generación de XML y HTML:

>>> from lxml.builder import E

>>> html = page = (
...   E.html(       # create an Element called "html"
...     E.head(
...       E.title("This is a sample document")
...     ),
...     E.body(
...       E.h1("Hello!"),
...       E.p("This is a paragraph with ", E.b("bold"), " text in it!"),
...       E.p("This is another paragraph, with a", "\n      ",
...         E.a("link", href="http://www.python.org"), "."),
...       E.p("Here are some reserved characters: <spam&egg>."),
...     )
...   )
... )

>>> print(etree.tostring(page, pretty_print=True))
<html>
  <head>
    <title>This is a sample document</title>
  </head>
  <body>
    <h1>Hello!</h1>
    <p>This is a paragraph with <b>bold</b> text in it!</p>
    <p>This is another paragraph, with a
      <a href="http://www.python.org">link</a>.</p>
    <p>Here are some reserved characters: &lt;spam&amp;egg&gt;.</p>
  </body>
</html>

Aprecio en E-fábrica de TI siguientes cosas

Código lee casi como el documento XML resultante

Readibility cuenta.

Permite la creación de cualquier contenido XML

Soporta cosas como:

  • uso de espacios de nombres
  • empezando y terminando nodos de texto dentro de un elemento
  • funciones de formato contenido de los atributos (véase la clase func en la muestra lxml completo )

Permite construcciones de fácil lectura con listas

p.ej:

from lxml import etree
from lxml.builder import E
lst = ["alfa", "beta", "gama"]
xml = E.root(*[E.record(itm) for itm in lst])
etree.tostring(xml, pretty_print=True)

Resultando en:

<root>
  <record>alfa</record>
  <record>beta</record>
  <record>gama</record>
</root>

conclusiones

Te recomiendo la lectura tutorial lxml - que está muy bien escrito y le dará muchas más razones para usar esta poderosa biblioteca.

La única desventaja de lxml es, que debe ser compilado. Ver SO responder para obtener más consejos cómo instalar lxml del paquete de formato de rueda dentro de una fracción de segundo.

Respondida el 17/04/2014 a las 22:32
fuente por usuario

votos
1

Creo que se debe utilizar para este lxml funcionabilidad

Respondida el 08/10/2014 a las 06:58
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more