XML의 처리 방법
- SAX (simple api for xml)
- Event 기반의 XML 처리 기법
- DOM (document object model)
- Object 기반의 XML 처리 기법
- XPath
- XSLT
XML 해석
- Parser가 XML 문서를 해석한 후, 응용프로그램에서 해석 결과를 가지고 이용한다.
- SAX에서는 XML 문서 구조에 대한 트리를 메모리에 생성하지 않고, 이벤트가 발생할 때마다 지정된 이름의 Callback이 이루어지게 된다.
- 문서를 순차적으로 읽으면서 발생
- 한가지 진행 방향으로만 참조가 가능
- 메모리의 사용량이 작다.
- 빠른 처리가 가능
- 노드의 추가나 노드의 이동 등 구조적인 변화를 주는 것은 불가능하다.
- DOM에서는 메모리 상에 문서 구조와 일치하는 객체 트리를 생성하고, 응용 프로그램은 API를 통해, 직접 참조하게 된다.
- 메모리의 부담이 증가
- SAX보다 처리시간이 많이 든다
- 전체 문서를 볼 수 있는 관점을 제공
- 임의의 노드 이동 및 수정, 추가가 자유롭다
XML 해석 - SAX
- 각각의 attribute에 대한 Handler를 작성해준다.
- Parser에서 handler를 등록해서, parsing을 시켜준다.
from xml.sax import make_parser, handler
import sys
class ProductHandler(handler.ContentHandler):
def __init__(self, productName):
self.productName = productName
self.productList = []
self.charActive = 0
self.searchActive = 0
def startElement(self, name, attrs):
if name == 'product':
if self.productName.lower() == attrs.get('name', '').lower():
self.searchActive = 1
else:
self.searchActive = 0
if not self.searchActive:
return
if name == 'vendor':
self.vendor = attrs.get('name', 'unknown')
elif name == 'price':
self.model = attrs.get('model', 'unknown')
self.priceStr = ''
self.charActive = 1
def endElement(self, name):
if self.searchActive and name == 'price':
self.productList.append( (self.vendor, self.model, int(self.priceStr) ) )
self.charActive = 0
def characters(self, content):
if self.charActive:
self.priceStr += content
def endDocument(self):
self.productList.sort(lambda a,b : cmp(a[2], b[2]))
for product in self.productList:
print '%-7s %6s %5s' % product
if __name__ == '__main__':
h = ProductHandler(sys.argv[1])
parser = make_parser()
parser.setContentHandler(h)
parser.parse('c:\python25\scripts\product.xml')
XML 해석 - DOM
- DOM 구조는 모듈로 나누어진다. 각 모듈은 Domain을 나타낸다.
- Core : 문서를 조작하고, 접근하여 사용하는 인터페이스 정의
- XML : Core를 기반으로 처리 명령, CDATA, 엔티티와 같은 XML 1.0 정규 규정을 처리 할 수 있도록 설계
- HTML : HTML 문서를 조작할 수 있는 인터페이스를 제공
- Events: XML 트리 조작에 따른 이벤트와 마우스, 키보드나 HTML 관련 이벤트와 같은 사용자 이벤트를 정의한다.
- Load/Save : XML 문서를 DOM Tree구조로 얻어오고, DOM 트리를 XML 문서로 저장하기 위한 연산 제공
- Validation : DOM 트리에 대한 메소드 정의
- XPath : DOM 트리를 검색하기 위한 편리하고 간편한 표현식을 사용 가능하게 한다.
- Range : 문서의 영역을 저장하기 위한 기능
- Traversal : DOM 트리를 검색하기 위한 메소드 제공
- Views : 하나의 문서를 여러 형태로 볼 수 있게 하는 기능 제공
- Style Sheets : 스타일 시트를 표현하기 위한 추상 인터페이스 제공
- CSS : CSS 스타일 시트나 문서 서식을 다룰 편리하고 간편한 기능 제공