16 장 . XML  사용하기
1.  파이썬과  XML 2. XML  문서 파싱하기 3.  노드 4.  엘리먼트 5.  엘리먼트 쉽게 다루기 6. XML  문서를  HTML 로 변환하기 7.  도서관리 프로그램
XML 이란 ? <ul><li>- XML (eXtensible Markup Language) </li></ul><ul><li>- W3C 에서  1998 년 표준 채택한 다목적 마크업 언어 </li></ul><ul><li...
파이썬과  XML <ul><li>-  파이썬  2.0  부터 표준 라이브러리에서  sax 와  dom 을 지원 </li></ul><ul><li>-  파이썬  3 에서는 기본적으로  Fast XML parsing usin...
Fast XML parsing using Expat <ul><li>-  빠른  XML  문서 파싱이 장점 </li></ul><ul><li>     - DOM  방식보다  1/6  정도만 소요 ,  메모리도  1/5 만 ...
DOM API <ul><li>- XML 문서의 각 성분을 객체로 표현하고 모든 객체를 메모리에 저장하고 처리하는 방법 </li></ul><ul><li>-  애플리케이션에서  XML 에 접근할 때 바로 접근 가능하며 연관...
SAX (Simple API for XML) - 1 <ul><li>- XML  문서를 파싱 할 때 구성요소를 발견할 때 마다 이벤트를 발생시켜  XML  문서를 처리하는 방법 </li></ul><ul><li>- XML ...
SAX (Simple API for XML) - 2 <ul><li>- SAX  구성요소 </li></ul><ul><li>     -  리더 (Reader) </li></ul><ul><li>         - XML Re...
The ElementTree XML API <ul><li>- XML  문서의 엘리먼트를 파이썬의 리스트와 사전으로 다룰 수 있는 인터페이스를 제공 </li></ul>
XML  문서 파싱하기  - 1 <ul><li>import xml.parsers.expat </li></ul><ul><li>def start_element(name, attrs): </li></ul><ul><li>   ...
XML  문서 파싱하기  - 2 <ul><li>from xml.dom.minidom import * </li></ul><ul><li>xmlsrc = &quot;&quot;&quot;<item> </li></ul><ul>...
XML  문서 파싱하기  - 3 <ul><li>doc = parseString(xmlsrc) </li></ul><ul><li>print(doc) </li></ul><ul><li>print(doc.toxml()) </li...
XML  파일 로드  /  파싱 <ul><li>def LoadXMLFromFile(): </li></ul><ul><li>     fileName = str(input(&quot;please input file name ...
노드 <ul><li>- DOM 에서 모든 컴포넌트들의 부모 클래스 </li></ul><ul><li>-  하위 속성 </li></ul><ul><li>     -  엘리먼트 노트 </li></ul><ul><li>     -...
노드 중요 메소드와 속성 <ul><li>- Node.nodeType :  노드 타입을 나타내는 정수값 (p.355) </li></ul><ul><li>- Node.parentNode :  현재 노드의 부모 노드 </li>...
엘리먼트 <ul><li>- Element.getElementsByTagName(tagName) :  엘리먼트 이름 중  tagName 과 매칭되는 엘리먼트들을 리턴 </li></ul><ul><li>- Element.ge...
엘리먼트 쉽게 다루기 <ul><li>  - xml.dtree.ElementTree.parse(file[, parser]) :  파일로부터  XML 문서를 읽어와 파싱 , parser 가 입력되면 입력된  parser 를...
ElementTree  객체 <ul><li>- find(path) : path 에 매칭되는 엘리먼트들을 리턴 </li></ul><ul><li>- getiterator([tag]) :  현재 엘리먼트의 하위 엘리먼트를 모...
XML  문서를  HTML 로 변환하기 <ul><li>- p.363 </li></ul><ul><li>- createDocument()  메서드를 이용해  DOM 객체를 생성 </li></ul><ul><li>- HTML ...
도서관리 프로그램 <ul><li>p.365~p.370 </li></ul>
Upcoming SlideShare
Loading in …5
×

16장. XML 사용하기

2,257 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
2,257
On SlideShare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
8
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

16장. XML 사용하기

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

×