Minimale DOM-Implementierung:
Link .
Python bietet eine vollständige W3C-Standardimplementierung von XML DOM ( xml.dom ) und eine minimale xml.dom.minidom . Letzteres ist einfacher und kleiner als die vollständige Implementierung. Aus einer "Parsing-Perspektive" hat es jedoch alle Vor- und Nachteile des Standard-DOM - dh es lädt alles in den Speicher.
Betrachten einer grundlegenden XML-Datei:
<?xml version="1.0"?>
<catalog>
<book isdn="xxx-1">
<author>A1</author>
<title>T1</title>
</book>
<book isdn="xxx-2">
<author>A2</author>
<title>T2</title>
</book>
</catalog>
Ein möglicher Python-Parser mit Minidom ist:
import os
from xml.dom import minidom
from xml.parsers.expat import ExpatError
curpath = os.path.dirname( os.path.realpath(__file__) )
filename = os.path.join(curpath, "sample.xml")
try:
xmldoc = minidom.parse(filepath)
except ExpatError as e:
print "[XML] Error (line %d): %d" % (e.lineno, e.code)
print "[XML] Offset: %d" % (e.offset)
raise e
except IOError as e:
print "[IO] I/O Error %d: %s" % (e.errno, e.strerror)
raise e
else:
catalog = xmldoc.documentElement
books = catalog.getElementsByTagName("book")
for book in books:
print book.getAttribute('isdn')
print book.getElementsByTagName('author')[0].firstChild.data
print book.getElementsByTagName('title')[0].firstChild.data
Beachten Sie, dass xml.parsers.expat eine Python-Schnittstelle zum nicht validierenden Expat-XML-Parser ist (docs.python.org/2/library/pyexpat.html).
Das xml.dom- Paket enthält auch die Ausnahmeklasse DOMException , wird jedoch nicht in minidom unterstützt !
Die ElementTree XML-API:
Link .
ElementTree ist viel einfacher zu verwenden und benötigt weniger Speicher als XML DOM. Darüber hinaus ist eine C-Implementierung verfügbar ( xml.etree.cElementTree ).
Ein möglicher Python-Parser mit ElementTree ist:
import os
from xml.etree import cElementTree
from xml.parsers.expat import ExpatError
curpath = os.path.dirname( os.path.realpath(__file__) )
filename = os.path.join(curpath, "sample.xml")
try:
tree = cElementTree.parse(filename)
except ExpatError as e:
print "[XML] Error (line %d): %d" % (e.lineno, e.code)
print "[XML] Offset: %d" % (e.offset)
raise e
except IOError as e:
print "[XML] I/O Error %d: %s" % (e.errno, e.strerror)
raise e
else:
catalogue = tree.getroot()
for book in catalogue:
print book.attrib.get("isdn")
print book.find('author').text
print book.find('title').text