2011-11-05 31 views
26

He estado usando minidom para analizar XML durante años. Ahora, de repente, aprendí sobre Element Tree. Mi pregunta que es mejor para el análisis? Es decir:XML Parsing: Element Tree (etree) vs. minidom

  • ¿Qué es más rápido?
  • ¿Qué utiliza menos memoria?
  • ¿Alguna de las dos tiene dependencias O (n^2) de las que debería preocuparme?
  • ¿Se está depreciando uno en favor de otro?

¿Por qué tenemos dos interfaces?

Gracias.

Respuesta

14

Python tiene dos interfaces probablemente porque Element Tree se integró a la biblioteca estándar mucho después de que se creó minidom. La razón para esto fue probablemente su API mucho más "Pythonic" en comparación con el DOM controlado por W3C.

Si le preocupa la velocidad, también existe lxml, que construye un DOM compatible con ElementTree utilizando libxml2 y debe ser bastante rápido: tienen una suite de comparación que se compara con las implementaciones de Python y C de ElementTree disponibles.

Si le preocupa el uso de la memoria, no debe utilizar una API de árbol de todos modos; PullDOM podría ser una mejor opción, pero estoy extrapolando de la experiencia usando el excelente analizador de extracción de Java: no parece haber mucha información actual sobre PullDOM.

17

Las interfaces DOM y Sax para el análisis XML son las formas clásicas de trabajar con XML. Python tuvo que proporcionar esas interfaces porque son conocidas y estándar.

El paquete ElementTree estaba destinado a proporcionar una interfaz más Pythonic. Se trata de hacer las cosas más fáciles para el programador.

Según su compilación, cada uno de ellos tiene una implementación C subyacente que los hace funcionar rápidamente.

Ninguna de las herramientas anteriores está en desuso. Cada uno tiene sus méritos (Sax no necesita leer toda la entrada en la memoria, por ejemplo).

También hay un módulo de terceros llamado lxml que también es una opción popular (con todas las funciones y rápido).

+3

Y si tiene problemas de rendimiento con el elemento, hay lxml que proporciona una interfaz compatible, pero utiliza una biblioteca de C muy ajustada, entre bastidores. – delnan