2011-11-05 11 views
26

Uso il minidom per analizzare XML per anni. Ora ho improvvisamente imparato su Element Tree. La mia domanda che è meglio per l'analisi? Ovvero:Analisi XML: Albero degli elementi (etree) vs minidom

  • Quale è più veloce?
  • Quale utilizza meno memoria?
  • Avete delle dipendenze O (n^2) di cui dovrei preoccuparmi?
  • Si sta deprezzando a favore di un altro?

Perché abbiamo due interfacce?

Grazie.

risposta

14

Python ha due interfacce probabilmente perché Element Tree è stato integrato nella libreria standard molto dopo, dopo che il minidom è diventato. La ragione di ciò era probabilmente la sua API molto più "Pythonic" rispetto al DOM controllato dal W3C.

Se siete preoccupati per la velocità, c'è anche lxml, che costruisce un DOM utilizzando libxml2-compatibile ElementTree e dovrebbe essere abbastanza veloce - hanno una suite di benchmark confrontandosi per Python e C implementazioni di ElementTree disponibili.

Se si è preoccupati per l'utilizzo della memoria, non si dovrebbe comunque utilizzare una API di albero; PullDOM potrebbe essere una scelta migliore, ma sto estrapolando dall'esperienza dell'uso dell'ottimo parser di Java - non sembrano esserci molte informazioni aggiornate su PullDOM.

17

Le interfacce DOM e Sax per l'analisi XML sono i metodi classici per lavorare con XML. Python doveva fornire queste interfacce perché sono ben note e standard.

Il pacchetto ElementTree aveva lo scopo di fornire un'interfaccia più Pythonic. Si tratta di rendere le cose più facili per il programmatore.

A seconda della build, ognuna di queste ha un'implementazione C sottostante che le rende veloci.

Nessuno degli strumenti sopra descritti è obsoleto. Ognuno di loro ha i suoi meriti (Sax non ha bisogno di leggere l'intero input in memoria, per esempio).

C'è anche un modulo di terze parti chiamato lxml che è anche una scelta popolare (piena funzionalità e veloce).

+3

E se si verificano problemi di prestazioni con l'elemento, c'è lxml che fornisce un'interfaccia compatibile ma utilizza una libreria C con un elevato livello di intensità e un'intensità di battaglia dietro le quinte. – delnan