2. 1. 파이썬과 XML 2. XML 문서 파싱하기 3. 노드 4. 엘리먼트 5. 엘리먼트 쉽게 다루기 6. XML 문서를 HTML 로 변환하기 7. 도서관리 프로그램
3. XML 이란 ? - XML (eXtensible Markup Language) - W3C 에서 1998 년 표준 채택한 다목적 마크업 언어 - 수많은 종류의 데이터를 표현하기 위한 기술 - 다양한 분야에서 사용중 - 파이썬에서는 XML 처리를 위해 DOM(Document Object Model), SAX(Simple API for XML) 등을 지원
4. 파이썬과 XML - 파이썬 2.0 부터 표준 라이브러리에서 sax 와 dom 을 지원 - 파이썬 3 에서는 기본적으로 Fast XML parsing using Expat, DOM API, SAX, The ElementTree XML API 를 지원 Fast XML parsing using Expat xml.parsers.expat DOM API xml.dom SAX xml.sax The ElementTree XML API xml.etree.ElementTree
5. Fast XML parsing using Expat - 빠른 XML 문서 파싱이 장점 - DOM 방식보다 1/6 정도만 소요 , 메모리도 1/5 만 사용 - xml.parser.expat 는 xmlparser 라는 단 하나의 모듈만 제공 - xml.parsers.expat.ParserCreate([ 인코딩 , [, 이름공간 구별자 ]]) : xmlparser 객체 생성 - xmlparser 객체를 이용하여 파싱 수행 - 빠른 파싱을 위해 문서 유효성 검사는 하지 않음 - 주요 메서드 (p.342) - 주요 속성 (p.342) - xmlparser 핸들러 (p.343)
6. DOM API - XML 문서의 각 성분을 객체로 표현하고 모든 객체를 메모리에 저장하고 처리하는 방법 - 애플리케이션에서 XML 에 접근할 때 바로 접근 가능하며 연관된 데이터를 연속적으로 참고 가능 - Well-formed XML 문서는 DOM 에서 트리 형태로 표현 - 2 가지 기본 모듈 제공 - minidom : 대부분 사용 - pulldom : 메모리가 부족하거나 XML 문서가 클때 사용 - DOM 에서 사용 되는 객체 (p. 344)
7. SAX (Simple API for XML) - 1 - XML 문서를 파싱 할 때 구성요소를 발견할 때 마다 이벤트를 발생시켜 XML 문서를 처리하는 방법 - XML 문서 내용을 변경 할 수 없음 (Read only) - 문서의 첫 부분에서 시작해 아래 부분으로 진행 ( 순차적 ) - 사용자는 원하는 요소 처리를 위한 함수를 생성하고 이벤트 핸들러에 함수를 연결 - 객체 기반 방식 (DOM) 보다는 빠르지만 한번 처리한 문서를 재사용 불가 - 이벤트 기반의 문서 처리 - 매우 큰 XML 문서를 처리 할 때 많이 사용 - xml.sax 메서드 (p.345)
8. SAX (Simple API for XML) - 2 - SAX 구성요소 - 리더 (Reader) - XML Reader : SAX 파서들의 기본 클래스 - Locator : 문서 내부의 로케이터와 SAX 이벤트와 연결 - InputSource : XML 문서 인코딩을 파서에 알려줌 - 주로 사용하는 메소드 (p.346) - 핸들러 - 컨텐츠 핸들러 : 도큐먼트 안의 정보를 파싱하면서 사용 - DTD 핸들러 : DTD 이벤트를 위한 핸들러 - 에러 핸들러 : 에러 혹은 경고 발생시 처리 - XML 문서
11. XML 문서 파싱하기 - 2 from xml.dom.minidom import * xmlsrc = /slideshow/16-xml/10399746/"""<item> <name>test</name> </item> """ doc = parseString(xmlsrc) print(doc) print(doc.toxml()) => result <xml.dom.minidom.Document instance at 0x10bd515a8> <?xml version="1.0" ?><item> <name>test</name> </item>
12. XML 문서 파싱하기 - 3 doc = parseString(xmlsrc) print(doc) print(doc.toxml()) a = doc.createElement("test") a.setAttribute("rrr", "value") b = doc.createTextNode("addTextNode") a.appendChild(b) print(a.toxml()) => result [<DOM Element: name at 0x1039437a0>] 1 <test rrr="value">addTextNode</test>
13. XML 파일 로드 / 파싱 def LoadXMLFromFile(): fileName = str(input("please input file name to load : ")) global xmlFD try: xmlFD = open(fileName) except IOError: print("invalid file name or path") return None else: try: dom = parse(xmlFD) except Exception: print("loading fail!!!") else: print("XML Document loading complete") return dom return None
14. 노드 - DOM 에서 모든 컴포넌트들의 부모 클래스 - 하위 속성 - 엘리먼트 노트 - 속성 노드 - 텍스트 노드 - 기타 등등의 노드
15. 노드 중요 메소드와 속성 - Node.nodeType : 노드 타입을 나타내는 정수값 (p.355) - Node.parentNode : 현재 노드의 부모 노드 - Node.attributes : 속성 객체의 NamedNodeMap, read-only - Node.nextSibing : 같은 부모를 가지고 있는 다른노드중 현재 노드의 다음 노드를 가리킨다 . - Node.previousSibing : 같은 부모를 가지고 있는 다른노드중 현재노드의 이전 노드를 가리킨다 . - Node.childNodes : 현재 노드의 자식 노드 리스트 - Node.firstChild : 자식 노드들 중 첫 번째 노드 - Node.lastChild : 자식 노드들 중 마지막 노드 - Node.localName : 태그네임에 콜론 (:) 이 있을 경우 콜론 (:) 이후에 오는 부분을 의미 - Node.prefix : 태그네임에 콜론 (:) 이 있을 경우 콜론 앞쪽을 의미 - Node.namespaceURI : 노드가 엘리먼트 타입일 때 , 이름공간이 지정되어 있으면 이름공간값 ( 문자열 ) 이 들어가고 이름공간이 없는 경우 None - Node.hasAttributes() : 노드에 속성이 있으면 True 를 리턴 - Node.hasChildNodes() : 자식 노드가 있으면 True 를 리턴 - Node.isSameNode(other) : 인수로 받은 other 노드와 현재 노드가 같으면 True 를 리턴 - Node.appendChild(newChild) : 새로운 노드를 현재 노드의 자식 노드로 추가 - Node.insertBefore(newChild, refChild) : 새로운 노드를 지정된 노드 앞쪽에 추가 - Node.removeChild(oldChild) : 지정된 자식노드를 삭제 - Node.replaceChild(newChild, oldChild) : 기존의 자식노드를 새 노드로 변경 - Node.normalize() : 노드의 텍스트 정보를 정규화 한다 . 빈칸은 삭제하고 비어있는 엘리먼트는 빈 태그로 변경 - Node.cloneNode(deep) : 현재노드를 복사해서 리턴
16. 엘리먼트 - Element.getElementsByTagName(tagName) : 엘리먼트 이름 중 tagName 과 매칭되는 엘리먼트들을 리턴 - Element.getElementsByTagNameNS(namespaceURI, localName) : XML 문서에 이름공간이 지정되어 있는 경우 , namespaceURI 안에 localName 과 매칭되는 엘리먼트들을 리턴 - Element.hasAttribute(name) : 엘리먼트 속성 중 name 에 해당하는 속성이 있으면 참을 리턴 - Element.hasAttributeNS(namespaceURI, localName) : XML 문서에 이름공간이 지정되어 있는 경우 , namespaceURI 안에 localName 과 매칭되는 엘리먼트가 있으면 참을 리턴 - Element.getAttribute(name) : name 에 해당하는 속성 값을 출력 - Element.getAttributeNS(namespaceURI, localName) : XML 문서에 이름공간이 지정되어 있는 경우 , namespaceURI 안에 localName 과 매칭되는 속성 값을 리턴 - Element.getAttributeNodeNS(namespaceURI, localName) : XML 문서에 이름공간이 지정되어 있는 경우 , namespaceURI 안에 localName 과 매칭되어 속성 객체 Attr 을 리턴 - Element.removeAttribute(name) : name 에 해당하는 속성을 삭제 - Element.removeAttributeNode(oldAttr) : 속성 리스트들 중에서 oldAttr 에 해당하는 속성을 삭제하고 삭제한 속성을 리턴 - Element.removeAttributeNS(namespaceURI, localName) : XML 문서에 이름공간이 지정되어 있는 경우 , namespaceURI 안에 localName 과 매칭되는 속성을 삭제 - Element.setAttribute(name, value) : name 에 해당하는 속성 값을 value 로 변경 - Element.setAttributeNode(newAttr) : newAttr 에 해당하는 속성이 이미 있다면 기존의 속성과 교체 , 없다면 속성 추가 - Element.setAttrivuteNodeNS(namespaceURI, localName, newAttr) : XML 문서에 이름공간이 지정되어 있는 경우 , namespaceURI 안에 localName 과 매칭되는 속성이 이미 있다면 기존의 속성과 교체 , 없다면 새로운 속성이 추가
17. 엘리먼트 쉽게 다루기 - xml.dtree.ElementTree.parse(file[, parser]) : 파일로부터 XML 문서를 읽어와 파싱 , parser 가 입력되면 입력된 parser 를 사용하여 입력되지 않으면 XMLBuildTree 파서 사용 , 성공하면 xml.dtree.ElementTree.ElementTree 객체를 리턴 - xml.dtree.ElementTree.fromstring(text) : 문자열 text 를 파싱 . xml.dtree.ElementTree.ElementTree 객체를 리턴 - xml.dtree.ElementTree.Element(tag[, attrib][,**extra]) : tag 의 이름을 가진 엘리먼트를 생성 , 사전 형식으로 속성값을 지정 , 키워드 인수로 속성값을 설정 가능 , 생성 성공시 생성된 엘리먼트 인스턴트를 리턴 - xml.dtree.ElementTree.SubElement(parent, tag[,attrib[,**extra]]) : Element() 와 비슷하지만 parent 의 자식 엘리먼트로 생성 - xml.dtree.ElementTree.tostring(element[,encoding]) : element 객체를 XML 문자열로 변환 . encoding 을 지정하지 않으면 UTF-8 로 인코딩
18. ElementTree 객체 - find(path) : path 에 매칭되는 엘리먼트들을 리턴 - getiterator([tag]) : 현재 엘리먼트의 하위 엘리먼트를 모두 가져옴 , 만약 tag 가 지정되어 있으면 tag 에 해당하는 엘리먼트들만 리턴 - getroot() : 현재 XML 문서중 가장 상위 엘리먼트 객체를 리턴 - write(file[,encoding]) : 현재 ElementTree 객체를 file 에 저장합니다 . encoding 을
19. XML 문서를 HTML 로 변환하기 - p.363 - createDocument() 메서드를 이용해 DOM 객체를 생성 - HTML 의 태그가 될 엘리먼트들을 생성하고 생성된 DOM 객체에 삽입 - 리턴 값으로 생성한 DOM 객체를 XML 문자열로 반환