XML 구문 분석-ElementTree 대 SAX 및 DOM
파이썬에는 XML을 구문 분석하는 여러 가지 방법이 있습니다.
SAX 로 구문 분석의 기본 사항을 이해합니다 . 이벤트 기반 API를 사용하여 스트림 파서로 작동합니다.
DOM 파서도 이해합니다 . XML을 메모리로 읽어서 Python으로 액세스 할 수있는 객체로 변환합니다.
일반적으로해야 할 일, 메모리 제약, 성능 등에 따라 둘 중 하나를 선택하는 것이 쉬웠습니다.
(지금까지 내가 정확하기를 바랍니다.)
Python 2.5부터는 ElementTree 도 있습니다 . 이것은 DOM 및 SAX와 어떻게 비교됩니까? 어느 쪽과 더 비슷합니까? 이전 파서보다 나은 이유는 무엇입니까?
ElementTree는 XML 트리 (기본적으로)를 목록 구조로 표현하고 속성은 사전으로 표현하므로 사용하기가 훨씬 쉽습니다.
ElementTree는 DOM보다 XML 트리에 대해 훨씬 적은 메모리를 필요로하며 (따라서 더 빠릅니다),을 통한 구문 분석 오버 헤드 iterparse
는 SAX와 비슷합니다. 또한 iterparse
부분 구조를 반환하고 구조를 처리하는 즉시 폐기하여 구문 분석 중에 메모리 사용량을 일정하게 유지할 수 있습니다.
Python 2.5에서와 같이 ElementTree는 본격적인 XML 라이브러리에 비해 작은 기능 세트 만 가지고 있지만 많은 애플리케이션에 충분합니다. 유효성 검사 파서 또는 완전한 XPath 지원이 필요한 경우 lxml을 사용하면됩니다. 오랫동안 상당히 불안정했지만 2.1 이후로는 문제가 없었습니다.
ElementTree는 노드가 부모와 형제에 액세스 할 수있는 DOM에서 벗어납니다. 텍스트 노드가 실제 노드로 처리되지 않기 때문에 데이터 저장소가 아닌 실제 문서를 처리하는 것도 약간 번거 롭습니다. XML 스 니펫에서
<a>This is <b>a</b> test</a>
문자열 test
은 소위 tail
element b
입니다.
일반적으로 Python을 사용한 모든 XML 처리의 기본값으로 ElementTree를, 특정 문제에 대한 솔루션으로 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>
minidom을 사용하는 가능한 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.parsers.expat이 국외 거주자의 타당성을 검증하지 않는 XML 파서 (docs.python.org/2/library/pyexpat.html)에 파이썬 인터페이스입니다.
xml.dom의 또한 패키지 공급 예외 클래스 예외 : DOMException는 있지만에서 supperted되지 minidom !
ElementTree XML API :
Link.
ElementTree is much easier to use and it requires less memory than XML DOM. Furthermore, a C implementation is available (xml.etree.cElementTree).
A possible Python parser using ElementTree is:
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's parse() is like DOM, whereas iterparse() is like SAX. In my opinion, ElementTree is better than DOM and SAX in that it provides API easier to work with.
ElementTree has more pythonic API. It also is in the standard library now so using it reduces dependencies.
I actually prefer lxml as it has API like ElementTree, but has also nice additional features and performs well.
참고URL : https://stackoverflow.com/questions/192907/xml-parsing-elementtree-vs-sax-and-dom
'Programing' 카테고리의 다른 글
JavaScript : 빈 배열, []는 조건부 구조에서 참으로 평가됩니다. (0) | 2020.11.12 |
---|---|
Python 3에서 True와 False의 다른 객체 크기 (0) | 2020.11.12 |
'문자열'의 정의 뒤에 숨겨진 역사 (0) | 2020.11.12 |
리플 로우와 리 페인트의 차이점은 무엇입니까? (0) | 2020.11.12 |
Intent.putExtra로 배열 보내기 (0) | 2020.11.12 |