XML 구문 분석 - 요소트리 대 SAX 및 DOM
Python은 XML을 구문 분석하는 여러 가지 방법을 가지고 있습니다.
SAX로 파싱하는 것의 기본을 이해합니다.이벤트 기반 API로 스트림 파서 기능을 합니다.
DOM 파서도 이해합니다.XML을 메모리로 읽어 파이썬으로 접근할 수 있는 객체로 변환합니다.
일반적으로 해야 할 일, 기억력 제약, 성능 등에 따라 둘 중 하나를 쉽게 선택할 수 있었습니다.
(내가 지금까지 맞았기를 바랍니다.)
파이썬 2.5부터는 ElementTree도 있습니다.이것은 DOM과 SAX와 비교하면 어떻습니까?어떤 것과 더 비슷합니까?이전 파서보다 더 좋은 이유는 무엇입니까?
ElementTree는 XML 트리(기본적으로)를 목록의 구조로 나타내고 속성은 사전으로 나타내기 때문에 훨씬 사용하기 쉽습니다.
ElementTree는 XML 트리에 대해 DOM보다 훨씬 적은 메모리를 필요로 하기 때문에 더 빠릅니다.iterparse
SAX에 필적합니다.또한.iterparse
는 부분 구조를 반환하며, 구조를 처리하는 즉시 폐기하여 파싱하는 동안 메모리 사용량을 일정하게 유지할 수 있습니다.
ElementTree는 Python 2.5에서와 마찬가지로 완전한 XML 라이브러리에 비해 작은 피쳐 세트만 가지고 있지만 많은 응용 프로그램에 충분합니다.검증 파서 또는 전체 XPath 지원이 필요한 경우 lxml을 사용하는 것이 좋습니다.예전에는 상당히 불안정했는데 2.1 이후로는 문제가 없었습니다.
ElementTree는 노드가 부모 및 형제에 액세스할 수 있는 DOM에서 벗어납니다.텍스트 노드는 실제 노드로 취급되지 않기 때문에 데이터 저장소가 아닌 실제 문서를 처리하는 것도 다소 번거롭습니다.XML 토막글에서
<a>This is <b>a</b> test</a>
끈을test
이른바tail
요소가 있는b
.
일반적으로 Element를 추천합니다.트리는 Python을 사용하는 모든 XML 처리의 기본값이며, DOM 또는 SAX는 특정 문제에 대한 솔루션입니다.
최소 DOM 구현:
링크.
Python은 XML DOM(xml.dom)의 완전한 W3C 표준 구현과 최소한의 구현인 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>
미니돔을 사용할 수 있는 파이썬 파서는 다음과 같습니다.
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은 Expat 비 validating XML 파서(docs.python.org/2/library/pyexpat.html) 에 대한 Python 인터페이스입니다.
xml.dom 패키지는 예외 클래스 DOME exception도 제공하지만 minidom에서는 지원되지 않습니다!
더 엘리먼트트리 XML API:
링크.
ElementTree는 XML DOM보다 훨씬 사용하기 쉽고 메모리도 덜 필요합니다.또한 C 구현(xml.etree)을 사용할 수 있습니다.cElementTree).
Element를 이용한 Python 파서 가능트리:
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에 더 많은 pythonic API가 있습니다.현재 표준 라이브러리에도 있기 때문에 의존성이 줄어듭니다.
Element와 같은 API를 가지고 있어서 lxml을 더 선호합니다.트리지만, 부가적인 특징도 좋고 성능도 좋습니다.
ElementTree의 parse()는 DOM과 같고 iterparse()는 SAX와 같습니다.내 생각에, 요소트리는 작업하기 쉬운 API를 제공한다는 점에서 DOM이나 SAX보다 우수합니다.
언급URL : https://stackoverflow.com/questions/192907/xml-parsing-elementtree-vs-sax-and-dom
'programing' 카테고리의 다른 글
linux/list.h의 macro의 container_뒤에 있는 이론적 근거 (0) | 2023.11.02 |
---|---|
__sync_sync_sync_sync는 어떤 역할을 합니까? (0) | 2023.11.02 |
Spring Security로 사용자 업데이트 시 권한을 다시 로드하는 방법 (0) | 2023.11.02 |
자바스크립트에서 Pass by Value and Pass by Reference (0) | 2023.11.02 |
MySQL에서 테이블의 고유 제약 조건을 표시하려면 어떻게 해야 합니까? (0) | 2023.11.02 |