XML parsing-ElementTree vs SAX and DOM
Python имеет несколько способов анализа XML...
Я понимаю самые основы парсинга с Сакс. Он функционирует как потоковый парсер, с событийно-ориентированный API-интерфейс.
Я понимаю DOM парсер тоже. Он считывает XML в память и преобразует его в объекты, к которым можно получить доступ с помощью Python.
вообще говоря, это было легко, чтобы выбрать между двумя в зависимости от того, что вам нужно сделать, ограничения памяти, производительность, так далее.
(надеюсь, я прав до сих пор.)
начиная с Python 2.5, у нас также есть ElementTree. Как это соотносится с DOM и SAX? На что он больше похож? Почему это лучше, чем предыдущие Парсеры?
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