Elaborare XML in Python

voti
61

Sto per costruire un pezzo di un progetto che avrà bisogno di costruire e inviare un documento XML a un servizio Web e mi piacerebbe farlo in Python, come un mezzo per ampliare le mie competenze in esso.

Purtroppo, mentre so che il modello XML abbastanza bene in .NET, sono incerti quali sono i pro ei contro sono dei modelli XML in Python.

Qualcuno ha fare l'elaborazione XML in Python esperienza? Dove si possono proporre comincio? I file XML sarò edificio sarà abbastanza semplice.

È pubblicato 02/08/2008 alle 02:35
fonte dall'utente
In altre lingue...                            


16 risposte

voti
6

Dive Into Python ha un capitolo. Non posso garantire per quanto è buono sarebbe però.

Risposto il 02/08/2008 a 02:43
fonte dall'utente

voti
22

Personalmente, ho giocato con alcune delle opzioni built-in su un progetto XML-pesanti e hanno optato per pulldom come la scelta migliore per i documenti meno complessi.

Soprattutto per le piccole cose semplici, mi piace la teoria event-driven di analisi, piuttosto che la creazione di una grande quantità di callback per una struttura relativamente semplice. Ecco una buona discussione rapida di come utilizzare l'API .

Quello che mi piace: è possibile gestire l'analisi in un forciclo piuttosto che usare i callback. È anche ritardare completa analisi (il "tirare" parte) e si ottiene solo ulteriori dettagli quando si chiama expandNode(). Questo soddisfa il mio requisito generale per l'efficienza "responsabile", senza sacrificare la facilità d'uso e semplicità.

Risposto il 02/08/2008 a 03:01
fonte dall'utente

voti
30

ElementTree ha una bella API pythony. Penso che sia anche fornito come parte di Python 2.5

E 'in puro Python e come ho detto, molto bello, ma se si finisce che necessitano di maggiori prestazioni, quindi lxml espone la stessa API e usa libxml2 sotto il cofano. È possibile teoricamente solo scambiare in quando si scopre avete bisogno.

Risposto il 02/08/2008 a 14:21
fonte dall'utente

voti
3

Dal momento che lei ha detto che sarete costruendo XML "abbastanza semplice", il modulo di minidom (parte della libreria standard di Python) sarà probabilmente adatto alle vostre esigenze. Se avete qualche esperienza con la rappresentazione DOM di XML, si dovrebbe trovare l'API abbastanza semplice.

Risposto il 02/08/2008 a 17:04
fonte dall'utente

voti
4

Scrivo un server SOAP che riceve le richieste XML, e crea risposte XML. (Purtroppo, non è il mio progetto, quindi è closed source, ma questo è un altro problema).

Si è scoperto per me che la creazione di documenti XML (SOAP) è abbastanza semplice, se si dispone di una struttura di dati che "si adatta" lo schema.

Continuo la busta, poiché la busta risposta è (quasi) la stessa della busta richiesta. Poi, dato che la mia struttura dati è un dizionario (eventualmente inserita), creo una stringa che trasforma questo dizionario in <key> Valore </ key> elementi.

Questo è un compito che la ricorsione rende semplice, e io alla fine con la struttura giusta. Tutto questo è stato fatto in codice python, ed è attualmente abbastanza veloce per l'uso in produzione.

È possibile anche (relativamente) creare facilmente liste pure, anche se a seconda del cliente, si può colpire i problemi a meno che non si dà suggerimenti di lunghezza.

Per me, questo era molto più semplice, dal momento che un dizionario è un modo molto più semplice di lavorare di alcuni classe personalizzata. Per i libri, la generazione di XML è molto più facile che l'analisi!

Risposto il 03/08/2008 a 07:34
fonte dall'utente

voti
3

Personalmente ritengo che il capitolo da Dive Into Python è grande. Verificare che fuori prima - usa il modulo minidom ed è un buon pezzo di scrittura.

Risposto il 11/08/2008 a 17:02
fonte dall'utente

voti
1

Recentemente ho iniziato ad usare Amara con successo.

Risposto il 11/08/2008 a 21:40
fonte dall'utente

voti
5

Ci sono 3 principali modi di trattare con XML, in generale: dom, sax, e XPath. Il modello dom è buono se si può permettere di caricare l'intero file XML in memoria in una sola volta, e non ti dispiace che fare con strutture di dati, e si sta guardando molto / la maggior parte del modello. Il modello di sax è grande se vi interessa soltanto alcuni tag, e / o avete a che fare con file di grandi dimensioni e in grado di elaborarli in modo sequenziale. Il modello XPath è un po 'di ciascuno - è possibile scegliere percorsi per gli elementi di dati necessari, ma richiede più librerie da usare.

Se si vuole semplice e confezionato con Python, minidom è la vostra risposta, ma è piuttosto scadente, e la documentazione è "ecco docs su Dom, andate a capirlo". È veramente noioso.

Personalmente, mi piace cElementTree, che è un più veloce (c-based) attuazione elementtree, che è un modello dom-like.

Ho usato sistemi di sax, e per molti versi sono più "divinatorio" nel loro sentire, ma io di solito finiscono per creare sistemi basati sullo stato di gestirli, e in questo modo bugie follia (e gli insetti).

Io dico andare con minidom se ti piace la ricerca, o ElementTree se volete un buon codice che funziona bene.

Risposto il 16/09/2008 a 03:35
fonte dall'utente

voti
1

Suppongo che il Net-via di elaborazione XML si basa sulla versione'som di MSXML ed è questo caso presumo che usando per esempio minidom ti fa sentire un po 'a casa. Tuttavia, se si tratta di semplice elaborazione voi state facendo qualsiasi libreria probabilmente fare.

Anche a me preferisce lavorare con ElementTree quando si tratta di XML in Python, è una libreria molto ordinato.

Risposto il 16/09/2008 a 05:20
fonte dall'utente

voti
5

Ho usato ElementTree per diversi progetti e lo consiglio.

E 'divinatorio, arriva 'nella casella' con Python 2.5, tra cui la versione c cElementTree (xml.etree.cElementTree), che è 20 volte più veloce rispetto alla versione Python puro, ed è molto facile da usare.

lxml ha alcuni vantaggi perfomance, ma sono irregolari e si dovrebbe controllare i parametri di riferimento prima per il vostro caso d'uso.

Da quanto ho capito, il codice ElementTree può essere facilmente portato su lxml.

Risposto il 23/09/2008 a 18:42
fonte dall'utente

voti
1

Se avete intenzione di essere la costruzione di messaggi SOAP, controlla soaplib . Esso utilizza ElementTree sotto il cofano, ma fornisce un'interfaccia molto più pulito per la serializzazione e deserializzazione messaggi.

Risposto il 13/10/2008 a 21:17
fonte dall'utente

voti
5

Dipende un po 'da come complicato il documento deve essere.

Ho usato minidom un sacco per la scrittura di XML, ma che di solito è stato solo la lettura di documenti, rendendo alcune trasformazioni semplici, e la scrittura di nuovo fuori. Che ha funzionato abbastanza bene fino a quando ho avuto bisogno la possibilità di ordinare gli attributi degli elementi (per soddisfare un antico un'applicazione che non analizza XML correttamente). A quel punto ho rinunciato e ho scritto il codice XML stesso.

Se stai lavorando solo su documenti semplici, quindi farlo da soli può essere più veloce e più semplice che imparare un quadro. Se si può plausibilmente scrivere il codice XML a mano, poi probabilmente si può codificare a mano pure (basta ricordarsi di sfuggire correttamente caratteri speciali, e l'uso str.encode(codec, errors="xmlcharrefreplace")). Oltre a questi snafus, XML è sufficiente che non è normale è necessario una biblioteca speciale per scriverlo. Se il documento è troppo complicato da scrivere a mano, allora probabilmente si dovrebbe guardare in uno dei quadri già menzionati. In nessun punto si dovrebbe aver bisogno di scrivere uno scrittore generale XML.

Risposto il 14/10/2008 a 17:26
fonte dall'utente

voti
4

Si può anche provare Districare per analizzare i documenti XML semplici.

Risposto il 31/10/2011 a 12:05
fonte dall'utente

voti
1

Consiglio vivamente SAX - Simple API for XML - implementazione nelle librerie Python. Sono abbastanza facili da installare ed elaborare grandi XML API anche guidato, come discusso da manifesti precedenti qui, e hanno una bassa occupazione di memoria a differenza di validazione DOM stile parser XML.

Risposto il 12/12/2012 a 01:25
fonte dall'utente

voti
3

Per un lavoro serio con XML in Python uso lxml

Python viene fornito con ElementTree costruito in libreria, ma lxml estende in termini di velocità e funzionalità (convalida dello schema, sax analisi, XPath, vari tipi di iteratori e molte altre caratteristiche).

È necessario installarlo, ma in molti luoghi è già assunto di far parte della dotazione di serie (ad esempio Google AppEngine non consente package Python C-based, ma fa un'eccezione per lxml, pyyaml ​​e pochi altri).

Costruire documenti XML con E-factory (da lxml)

La tua domanda è di costruire documento XML.

Con lxml ci sono molti metodi e mi ci volle un po 'per trovare quello che sembra essere facile da usare e anche di facile lettura.

Codice di esempio da lxml doc sull'uso E-factory (leggermente semplificata):


L'E-fabbrica fornisce una sintassi semplice e compatta per la generazione di XML e 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>

Apprezzo su E-fabbrica seguendo le cose

Codice legge quasi come il documento XML risultante

Readibility conta.

Consente la creazione di qualsiasi contenuto XML

Supporta cose come:

  • uso di namespace
  • inizio e fine nodi di testo all'interno di un elemento
  • Funzioni di formattazione contenuto attributo (vedi func CLASS nel campione intero lxml )

Permette costrutti molto leggibili con liste

per esempio:

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)

con il risultato di:

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

conclusioni

Consiglio vivamente la lettura lxml Tutorial - è scritto molto bene e vi darà molte più ragioni per utilizzare questa potente libreria.

L'unico svantaggio di lxml è, che deve essere compilato. Vedere SO rispondere per ulteriori suggerimenti come installare lxml dal pacchetto formato ruota all'interno di frazioni di secondo.

Risposto il 17/04/2014 a 20:32
fonte dall'utente

voti
1

Penso che si dovrebbe utilizzare per questo lxml functionallity

Risposto il 08/10/2014 a 04:58
fonte dall'utente

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