You are here: Partenza > Dive Into Python > Elaborare XML > Create gestori separati per tipo di nodo | << >> | ||||
Dive Into PythonPython per programmatori esperti |
Il terzo suggerimento utile per processare gli XML comporta la separazione del vostro codice in funzioni logiche, basate sui tipi di nodi e nomi di elementi. I documenti XML analizzati sono fatti di vari tipi di nodi, di cui ognuno rappresenta un oggetto Python. Il livello base del documento stesso è rappresentato da un oggetto Document. Document contiene uno o più oggetti Element (per i tags XML reali), ognuno dei quali può contenere altri oggetti Element, oggetti Text (per parti di testo), od oggetti Comment (per commenti incorporati). Python rende semplice scrivere uno smistatore per separare la logica per ciascun tipo di nodo.
>>> from xml.dom import minidom >>> xmldoc = minidom.parse('kant.xml') >>> xmldoc <xml.dom.minidom.Document instance at 0x01359DE8> >>> xmldoc.__class__ <class xml.dom.minidom.Document at 0x01105D40> >>> xmldoc.__class__.__name__ 'Document'
Pensate per un momento che kant.xml si trovi nella directory corrente. | |
Come abbiamo visto nella sezione Package, l'oggetto ritornato dall'analisi di un documento XML è un oggetto Document, come definito in minidom.py del package xml.dom. Come abbiamo visto nella sezione Istanziare classi, __class__ è un attributo built-in di ogni oggetto Python. | |
Inoltre, __name__ è un attributo built-in di ogni classe Python, ed è una stringa. Questa stringa non è misteriosa; è la stessa del nome della classe che inserite quando definite una classe da voi. (Ritornate eventualmente alla sezione Definire classi.) |
Bene, così adesso possiamo ottenere il nome della classe di ogni particolare nodo XML (dato che ogni nodo XML viene rappresentato come un oggetto Python). Come possiamo utilizzare ciò a nostro vantaggio per separare la logica dell'analisi di ogni tipo di nodo? La risposta è getattr, che abbiamo visto precedentemente nella sezione Ottenere riferimenti agli oggetti usando getattr.
def parse(self, node): parseMethod = getattr(self, "parse_%s" % node.__class__.__name__) parseMethod(node)
def parse_Document(self, node): self.parse(node.documentElement) def parse_Text(self, node): text = node.data if self.capitalizeNextWord: self.pieces.append(text[0].upper()) self.pieces.append(text[1:]) self.capitalizeNextWord = 0 else: self.pieces.append(text) def parse_Comment(self, node): pass def parse_Element(self, node): handlerMethod = getattr(self, "do_%s" % node.tagName) handlerMethod(node)
In questo esempio, le funzioni di smistamento parse e parse_Element trovano semplicemente altri metodi nella stessa classe. Se il vostro processo è molto complesso (o avete nomi di etichette differenti), potreste spezzare il vostro codice in moduli separati ed usare l'importazione dinamica per importare ogni modulo e chiamare qualsiasi funzione di cui abbiate bisogno. L'import dinamico sarà discusso nel capitolo sulla Programmazione orientata ai dati.
<< Trovare i figli diretti di un nodo |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | |
Gestire gli argomenti da riga di comando >> |