Разбор XML — ElementTree против SAX и DOM

Минимальная реализация DOM:

Link.

Python предоставляет полную elementtree стандартную W3C реализацию py XML DOM (xml.dom) и минимальную dom реализацию, xml.dom.minidom. Последний вариант saxparser проще и меньше полной реализации. Однако etree с "точки зрения синтаксического sax анализа" у него есть xml все плюсы и минусы стандартного sax DOM, то есть он загружает python-interpreter все в память.

Рассмотрим простой xml XML-файл:



    
      A1
      T1
    
    
      A2
      T2
    

Возможный синтаксический html-dom анализатор Python, использующий python-shell minidom:

import os
from xml.dom import minidom
from xml.parsers.expat import ExpatError

#-------- Select the XML file: --------#
#Current file name and directory:
curpath = os.path.dirname( os.path.realpath(__file__) )
filename = os.path.join(curpath, "sample.xml")
#print "Filename: %s" % (filename)

#-------- Parse the XML file: --------#
try:
    #Parse the given XML file:
    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 - это xml-file интерфейс Python для непроверяющего pythonic анализатора XML Expat (docs.python.org/2/library/pyexpat.html).

Пакет pythonista xml.dom также предоставляет класс saxparser исключения DOMException, но он не поддерживается celementtree в minidom!

XML API ElementTree:

Link.

ElementTree намного проще в использовании python и требует меньше памяти, чем python XML DOM. Кроме того, доступна py реализация на языке C (xml.etree.cElementTree).

Возможный python синтаксический анализатор xml.etree Python, использующий ElementTree:

import os
from xml.etree import cElementTree  # C implementation of xml.etree.ElementTree
from xml.parsers.expat import ExpatError  # XML formatting errors

#-------- Select the XML file: --------#
#Current file name and directory:
curpath = os.path.dirname( os.path.realpath(__file__) )
filename = os.path.join(curpath, "sample.xml")
#print "Filename: %s" % (filename)

#-------- Parse the XML file: --------#
try:
    #Parse the given XML file:
    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

python

xml

dom

sax

elementtree

2022-10-27T23:04:09+00:00