XML parsing-ElementTree vs SAX and DOM



Python имеет несколько способов анализа XML...



Я понимаю самые основы парсинга с Сакс. Он функционирует как потоковый парсер, с событийно-ориентированный API-интерфейс.



Я понимаю DOM парсер тоже. Он считывает XML в память и преобразует его в объекты, к которым можно получить доступ с помощью Python.



вообще говоря, это было легко, чтобы выбрать между двумя в зависимости от того, что вам нужно сделать, ограничения памяти, производительность, так далее.



(надеюсь, я прав до сих пор.)



начиная с Python 2.5, у нас также есть ElementTree. Как это соотносится с DOM и SAX? На что он больше похож? Почему это лучше, чем предыдущие Парсеры?

551   4  

4 ответов:

ElementTree гораздо проще в использовании, потому что он представляет собой XML-дерево (в основном) в виде структуры списков, а атрибуты представлены в виде словарей.

ElementTree требует гораздо меньше памяти для XML-деревьев, чем DOM (и, следовательно, быстрее), а также накладные расходы на синтаксический анализ через iterparse сравним с саксофоном. Кроме того, iterparse возвращает частичные структуры, и вы можете сохранить постоянное использование памяти во время синтаксического анализа, отбрасывая структуры, как только вы обрабатываете их.

ElementTree, как и в Python 2.5, имеет только небольшой набор функций по сравнению с полномасштабными библиотеками XML, но этого достаточно для многих приложений. Если вам нужен проверяющий парсер или полная поддержка XPath, lxml-это путь. Долгое время он был довольно нестабильным, но у меня не было никаких проблем с ним с 2.1.

ElementTree отклоняется от DOM, где узлы имеют доступ к своим родителям и братьям и сестрам. Обработка фактических документов, а не хранилищ данных также является немного громоздко, потому что текстовые узлы не рассматриваются как фактические узлы. В XML-фрагменте

<a>This is <b>a</b> test</a>

строка test будут так называемые tail элемента b.

в общем, я рекомендую ElementTree как значение по умолчанию для всех XML-обработки с Python, а DOM или SAX как решения для конкретных проблем.

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

ссылке.

Python предоставляет полную, W3C-стандартную реализацию XML DOM ( xml.дом) и минимален, xml.дом.минидом. Это последнее проще и меньше, чем полная реализация. Однако, с точки зрения" разбора", у него есть все плюсы и минусы стандартного 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 с помощью минидом - это:

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.анализаторы.эмигрант - это интерфейс Python для экспата, не проверяющего синтаксический анализатор XML (docs.python.org/2/library/pyexpat.html).

The xml.дом комплексные поставки и класса exception DOMException, но это не подавляется в минидом!

ElementTree в формате XML API:

ссылке.

ElementTree гораздо проще в использовании и требует меньше памяти, чем XML DOM. Кроме того, доступна реализация C ( 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

разбор ElementTree() похож на DOM, тогда как iterparse () похож на SAX. На мой взгляд, ElementTree лучше, чем DOM и SAX в том, что он обеспечивает API легче работать.

ElementTree есть более подходящие для Python API-интерфейс. Он также находится в стандартной библиотеке, поэтому его использование уменьшает зависимости.

Я на самом деле предпочитаю lxml так как он имеет API, как ElementTree, но также имеет хорошие дополнительные функции и хорошо работает.

Comments

    Ничего не найдено.