
Είμαι έτοιμος να οικοδομήσουμε ένα κομμάτι του έργου που θα πρέπει να κατασκευάσει και να δημοσιεύσετε ένα έγγραφο XML σε μια υπηρεσία web και θα ήθελα να το κάνω σε Python, ως μέσο για την επέκταση των δεξιοτήτων μου σε αυτό. 


Δυστυχώς, ενώ ξέρω ότι το μοντέλο XML αρκετά καλά στη ΝΕΤ, είμαι αβέβαιο ποια είναι τα πλεονεκτήματα και τα μειονεκτήματα είναι τα μοντέλα XML σε Python. 


Όποιος έχει την εμπειρία να κάνει την επεξεργασία XML στην Python; Πού θα προτείνατε να αρχίσω; Τα αρχεία XML θα είμαι κτίριο θα είναι αρκετά απλή.

 
XML Processing στην Python
==========================



Προσωπικά, έχω παίξει με αρκετές από τις ενσωματωμένες επιλογές σε XML-βαρύ έργο και έχουν εγκατασταθεί σε [pulldom](http://docs.python.org/lib/module-xml.dom.pulldom.html) ως η καλύτερη επιλογή για λιγότερο πολύπλοκα έγγραφα.


Ειδικά για τα μικρά απλά πράγματα, μου αρέσει το γεγονός με γνώμονα τη θεωρία της ανάλυσης αντί για τη δημιουργία μια αρμαθιά από επιστροφές κλήσεων για μια σχετικά απλή δομή. [Εδώ είναι μια καλή γρήγορη συζήτηση για το πώς να χρησιμοποιήσετε το API](http://www.prescod.net/python/pulldom.html) .


Αυτό που μου αρέσει: μπορείτε να χειριστείτε το parsing σε ένα `for`βρόχο και όχι με τη χρήση επιστροφές κλήσεων. Μπορείτε επίσης να καθυστερήσουν την πλήρη συντακτική ανάλυση (η «τραβήξει» κομμάτι) και να πάρει μόνο πρόσθετες λεπτομέρειες όταν καλείτε `expandNode()`. Αυτό ικανοποιεί γενική απαίτηση μου για «υπεύθυνη» απόδοση χωρίς να θυσιάζει την ευκολία χρήσης και την απλότητα.

 

[Dive Into Python](http://diveintopython.net/xml_processing/) έχει ένα κεφάλαιο. Δεν μπορώ να εγγυηθώ για το πόσο καλό θα ήταν όμως.

 

[ElementTree](http://effbot.org/zone/element-index.htm) έχει μια ωραία pythony API. Νομίζω ότι ακόμα και αποστέλλονται ως μέρος της python 2.5


Είναι σε καθαρή python και όπως λέω, πολύ ωραία, αλλά αν περατωθεί χρειάζεται μεγαλύτερη απόδοση, τότε [lxml](http://codespeak.net/lxml/) εκθέτει το ίδιο API και χρησιμοποιεί libxml2 κάτω από την κουκούλα. Μπορείτε να θεωρητικά απλά να το ανταλλάξετε με όταν ανακαλύπτεις το χρειάζεστε.

 

Από τη στιγμή που ανέφερε ότι θα πρέπει να κτίριο «αρκετά απλή» XML, η [μονάδα minidom](http://www.python.org/doc/current/lib/module-xml.dom.minidom.html) (μέρος της πρότυπης βιβλιοθήκης της Python) κατά πάσα πιθανότητα θα ταιριάζει στις ανάγκες σας. Αν έχετε οποιαδήποτε εμπειρία με την εκπροσώπηση DOM του XML, θα πρέπει να βρείτε το API αρκετά απλό.

 

Γράφω ένα διακομιστή SOAP που δέχεται αιτήματα XML, και δημιουργεί αντιδράσεις XML. (Δυστυχώς, δεν είναι το έργο μου, γι 'αυτό είναι κλειστού κώδικα, αλλά αυτό είναι ένα άλλο πρόβλημα).


Αποδείχθηκε για μένα ότι η δημιουργία (SOAP) έγγραφα XML είναι αρκετά απλή, αν έχετε μια δομή δεδομένων που «ταιριάζει» το σχήμα.


Κρατάω το φάκελο, δεδομένου ότι ο φάκελος απάντηση είναι (σχεδόν) το ίδιο με το φάκελο αίτησης. Στη συνέχεια, αφού δομή δεδομένων μου είναι (ίσως ένθετα) λεξικό, μπορώ να δημιουργήσω μια σειρά που μετατρέπει αυτό το λεξικό σε <πλήκτρο> αξίας </ key> στοιχεία. 


Πρόκειται για ένα έργο που αναδρομή κάνει απλή, και καταλήγουν με τη σωστή δομή. Αυτό είναι όλα γίνονται σε κώδικα python, και σήμερα είναι αρκετά γρήγορος για παραγωγική χρήση.


Μπορείτε επίσης (σχετικά) δημιουργήσετε εύκολα λίστες, καθώς, αν και ανάλογα με τον πελάτη σας, μπορείτε να χτυπήσει προβλήματα, εκτός αν σας δώσει συμβουλές μήκους.


Για μένα, αυτό ήταν πολύ πιο απλό, δεδομένου ότι ένα λεξικό είναι πολύ πιο εύκολο τρόπο εργασίας από κάποιο έθιμο τάξη. Για τα βιβλία, τη δημιουργία XML είναι πολύ πιο εύκολο από ό, τι την ανάλυση!

 

Προσωπικά πιστεύω ότι το κεφάλαιο από την [Dive Into Python](http://www.diveintopython.org/xml_processing/index.html) είναι μεγάλη. Ελέγξτε ότι από την πρώτη - που χρησιμοποιεί τη μονάδα minidom και είναι ένα πολύ καλό κομμάτι της γραφής.

 

Πρόσφατα άρχισε να χρησιμοποιεί Amara με επιτυχία.

 

Υπάρχουν 3 μεγάλες τρόπους αντιμετώπισης XML, σε γενικές γραμμές: dom, σαξόφωνο, και xpath. Το μοντέλο dom είναι καλό, αν μπορείτε να αντέξετε οικονομικά να φορτώσει ολόκληρο το αρχείο xml σας στη μνήμη με τη μία, και δεν σας πειράζει που ασχολούνται με δομές δεδομένων, και ψάχνετε σε πολύ / το μεγαλύτερο μέρος του μοντέλου. Το μοντέλο σαξόφωνο είναι μεγάλη, αν νοιάζονται μόνο για λίγες ετικέτες, και / ή έχουμε να κάνουμε με μεγάλα αρχεία και να τα επεξεργάζονται διαδοχικά. Το μοντέλο XPath είναι ένα μικρό κομμάτι του καθένα - μπορείτε να επιλέξετε και να επιλέξετε διαδρομές με τα στοιχεία δεδομένων που χρειάζεστε, αλλά απαιτεί περισσότερες βιβλιοθήκες από τη χρήση.


Αν θέλετε απλή και συσκευάζονται με την Python, minidom είναι η απάντησή σας, αλλά είναι αρκετά κουτσός, και η τεκμηρίωση είναι «εδώ είναι docs για dom, πηγαίνετε να το καταλάβω». Είναι πραγματικά ενοχλητικό.


Προσωπικά, μου αρέσει cElementTree, η οποία είναι ταχύτερη (γ-based) εφαρμογή των ElementTree, το οποίο είναι ένα dom-σαν μοντέλο.


Έχω χρησιμοποιήσει συστήματα σαξόφωνο, και με πολλούς τρόπους είναι πιο «pythonic» σε αίσθηση τους, αλλά συνήθως καταλήγουν δημιουργία συστημάτων κατάσταση με βάση το να τα χειριστεί, και με αυτόν τον τρόπο βρίσκεται τρέλα (και τα σφάλματα).


Λέω πάει με minidom αν θέλετε την έρευνα, ή ElementTree αν θέλετε καλό κώδικα που λειτουργεί καλά.

 

Υποθέτω ότι η Καθαρά-τρόπος επεξεργασίας XML βασίζεται στην'som έκδοση του MSXML και η περίπτωση υποθέτω ότι η χρήση για παράδειγμα minidom θα σας κάνει να νιώσετε κάπως στο σπίτι. Ωστόσο, αν είναι απλή επεξεργασία κάνετε οποιαδήποτε βιβλιοθήκη κατά πάσα πιθανότητα θα κάνει.


Κι εγώ προτιμά να εργάζεται με ElementTree όταν ασχολείται με xml σε Python, αυτό είναι ένα πολύ τακτοποιημένο βιβλιοθήκη. 

 

Έχω χρησιμοποιήσει ElementTree για πολλά έργα και να το συστήσει. 


Είναι pythonic, έρχεται «στο πλαίσιο» με την Python 2.5, συμπεριλαμβανομένου του γ έκδοση cElementTree (xml.etree.cElementTree), η οποία είναι 20 φορές πιο γρήγορα από ό, τι το καθαρό έκδοση Python, και είναι πολύ εύκολο στη χρήση.


lxml έχει κάποια πλεονεκτήματα παράσταση, αλλά είναι άνιση και θα πρέπει να ελέγξετε τα σημεία αναφοράς πρώτα για την περίπτωση χρήσης σας.


Όπως το αντιλαμβάνομαι, κωδικό ElementTree μπορεί εύκολα να μεταφερθεί σε lxml. 

 

Αν πρόκειται να οικοδόμηση μηνύματα SOAP, ελέγξτε [soaplib](http://trac.optio.webfactional.com/) . Χρησιμοποιεί ElementTree κάτω από την κουκούλα, αλλά παρέχει ένα πολύ καθαρότερο περιβάλλον για συνέχειες και deserializing μηνύματα.

 

Εξαρτάται από λίγο σε πόσο πολύπλοκη είναι το έγγραφο που πρέπει να είναι.


Έχω χρησιμοποιήσει minidom πολλά για τη σύνταξη XML, αλλά αυτό είναι συνήθως έχουν μόνο την ανάγνωση εγγράφων, κάνοντας μερικές απλές μετατροπές, και γράφοντας τα πίσω. Αυτό λειτούργησε αρκετά καλά μέχρι που απαιτούνται για τη δυνατότητα να παραγγείλετε τα χαρακτηριστικά στοιχεία (για να ικανοποιήσει ένα αρχαίο εφαρμογή που δεν αναλύσει XML σωστά). Σε εκείνο το σημείο παράτησα και έγραψε το XML εαυτό μου.


Αν είστε μόνο εργάζονται για απλά έγγραφα, τότε το κάνετε εσείς μπορεί να είναι ταχύτερη και απλούστερη από την εκμάθηση ενός πλαισίου. Αν νοητό να γράψετε την XML με το χέρι, στη συνέχεια, μπορείτε πιθανώς να κωδικοποιήσει με το χέρι, καθώς και (απλά να θυμάστε να ξεφύγουν σωστά ειδικούς χαρακτήρες, και τη χρήση `str.encode(codec, errors="xmlcharrefreplace")`). Εκτός από αυτές τις snafus, XML είναι αρκετό ώστε να μην τακτική *χρειάζεται* μια ειδική βιβλιοθήκη για να το γράψω. Αν το έγγραφο είναι πολύ περίπλοκη για να γράψει με το χέρι, τότε μάλλον θα πρέπει να εξετάσουμε σε ένα από τα πλαίσια που ήδη αναφέρθηκαν. Σε κανένα σημείο που θα χρειαστεί για να γράψετε μια γενική συγγραφέας XML.

 

Μπορείτε επίσης να δοκιμάσετε [ξεμπερδεύω](https://github.com/stchris/untangle) για να αναλύσει απλά έγγραφα XML.

 

Θα ήθελα να συστήσω ανεπιφύλακτα SAX - Απλό API για XML - εφαρμογή στις βιβλιοθήκες Python. Είναι αρκετά εύκολο στην εγκατάσταση και την επεξεργασία μεγάλων XML με γνώμονα ακόμη API, όπως αναφέρθηκε από τις προηγούμενες αφίσες εδώ, και έχουν χαμηλό αποτύπωμα μνήμης σε αντίθεση με την επικύρωση DOM ανάλυσης XML στυλ.

 

Για σοβαρή δουλειά με XML σε Python χρήση lxml
==============================================


Python έρχεται με ElementTree ενσωματωμένο στη βιβλιοθήκη, αλλά lxml εκτείνεται από την άποψη της ταχύτητας και της λειτουργικότητας (επικύρωση σχήματος, σαξόφωνο ανάλυσης, XPath, διάφορα είδη iterators και πολλά άλλα χαρακτηριστικά).


Θα πρέπει να το εγκαταστήσετε, αλλά σε πολλά σημεία έχει ήδη θεωρείται ότι είναι μέρος του στάνταρ εξοπλισμού (π.χ. Google AppEngine δεν επιτρέπει πακέτα Python C-βάση, αλλά κάνει εξαίρεση για lxml, pyyaml ​​και μερικά άλλα).


Η οικοδόμηση των εγγράφων XML με E-εργοστάσιο (από lxml)
========================================================


Η ερώτησή σας είναι για την οικοδόμηση έγγραφο XML.


Με lxml υπάρχουν πολλές μέθοδοι και μου πήρε λίγο χρόνο για να βρείτε αυτό που φαίνεται να είναι εύκολο στη χρήση και εύκολο να το διαβάσετε.


Δείγμα κώδικα από [lxml doc σχετικά με τη χρήση Ε-εργοστάσιο](http://lxml.de/tutorial.html#the-e-factory) (ελαφρώς απλοποιημένη):




---


Το E-εργοστάσιο παρέχει μια απλή και συμπαγής σύνταξη για τη δημιουργία XML και 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>

```



---


Εκτιμώ στο E-εργοστάσιο το εξής πράγματα


### Κωδικός διαβάζει σχεδόν όπως το έγγραφο που προέκυψε XML


Ευανάγνωστου μετράει. 


### Επιτρέπει τη δημιουργία οποιουδήποτε περιεχομένου XML


Υποστηρίζει πράγματα όπως:


* χρήση των ονομάτων
* έναρξης και λήξης κόμβους κειμένου σε ένα στοιχείο
* λειτουργίες μορφοποίησης περιεχόμενο χαρακτηριστικό (βλέπε func CLASS στην [πλήρη δείγμα lxml](http://lxml.de/tutorial.html#the-e-factory) )


### Επιτρέπει πολύ ευανάγνωστη κατασκευάσματα με λίστες


π.χ:



```
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)

```

έχοντας ως αποτέλεσμα:



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

```

Συμπεράσματα
------------


Συστήνω ιδιαίτερα ανάγνωση lxml φροντιστήριο - είναι πολύ καλογραμμένο και θα σας δώσει πολλούς περισσότερους λόγους για να χρησιμοποιήσετε αυτό το ισχυρό βιβλιοθήκη.


Το μόνο μειονέκτημα της lxml είναι, ότι πρέπει να καταρτίζονται. Δείτε [SO απαντήσει για περισσότερες συμβουλές](https://stackoverflow.com/a/23141779/346478) πώς να εγκαταστήσετε lxml από το πακέτο μορφή τροχό μέσα σε κλάσματα του δευτερολέπτου.

 

Νομίζω ότι θα πρέπει να χρησιμοποιήσετε lxml για αυτό το functionallity

 