Мінімальна реалізація DOM:
Посилання .
Python забезпечує повну реалізацію стандарту W3C XML DOM ( xml.dom ) та мінімальну, xml.dom.minidom . Цей останній є простішим і меншим, ніж повне впровадження. Однак, з точки зору розбору, він має всі плюси і мінуси стандартного DOM - тобто завантажує все в пам’ять.
Розглядаючи базовий файл XML:
<?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>
Можливий парсер Python з використанням minidom :
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
Зверніть увагу, що xml.parsers.expat - це інтерфейс Python до неперевіряючого XML-аналізатора Expat (docs.python.org/2/library/pyexpat.html).
Пакет xml.dom також містить клас винятків DOMException , але він не працює в мінімальному режимі !
API ElementTree XML:
Посилання .
ElementTree набагато простіший у використанні, і він вимагає менше пам'яті, ніж XML DOM. Крім того, доступна реалізація C ( xml.etree.cElementTree ).
Можливий парсер Python за допомогою ElementTree :
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