잊지 않겠습니다.

XML 처리

Dynamic Language 2009. 1. 7. 13:11

XML의 처리 방법

  1. SAX (simple api for xml)
    1. Event 기반의 XML 처리 기법
  2. DOM (document object model)
    1. Object 기반의 XML 처리 기법
  3. XPath
  4. XSLT

  

XML 해석

  1. Parser가 XML 문서를 해석한 후, 응용프로그램에서 해석 결과를 가지고 이용한다.
  2. SAX에서는 XML 문서 구조에 대한 트리를 메모리에 생성하지 않고, 이벤트가 발생할 때마다 지정된 이름의 Callback이 이루어지게 된다.
    1. 문서를 순차적으로 읽으면서 발생
    2. 한가지 진행 방향으로만 참조가 가능
    3. 메모리의 사용량이 작다.
    4. 빠른 처리가 가능
    5. 노드의 추가나 노드의 이동 등 구조적인 변화를 주는 것은 불가능하다.
  3. DOM에서는 메모리 상에 문서 구조와 일치하는 객체 트리를 생성하고, 응용 프로그램은 API를 통해, 직접 참조하게 된다.
    1. 메모리의 부담이 증가
    2. SAX보다 처리시간이 많이 든다
    3. 전체 문서를 볼 수 있는 관점을 제공
    4. 임의의 노드 이동 및 수정, 추가가 자유롭다

  

XML 해석 - SAX

  1. 각각의 attribute에 대한 Handler를 작성해준다.
  2. 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 스타일 시트나 문서 서식을 다룰 편리하고 간편한 기능 제공

  

Posted by Y2K
,