ݺߣ

ݺߣShare a Scribd company logo
16 장 . XML  사용하기
1.  파이썬과  XML 2. XML  문서 파싱하기 3.  노드 4.  엘리먼트 5.  엘리먼트 쉽게 다루기 6. XML  문서를  HTML 로 변환하기 7.  도서관리 프로그램
XML 이란 ? - XML (eXtensible Markup Language) - W3C 에서  1998 년 표준 채택한 다목적 마크업 언어 -  수많은 종류의 데이터를 표현하기 위한 기술 -  다양한 분야에서 사용중 -  파이썬에서는  XML  처리를 위해  DOM(Document Object Model), SAX(Simple API for XML) 등을 지원
파이썬과  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
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)
DOM API - XML 문서의 각 성분을 객체로 표현하고 모든 객체를 메모리에 저장하고 처리하는 방법 -  애플리케이션에서  XML 에 접근할 때 바로 접근 가능하며 연관된 데이터를 연속적으로 참고 가능 - Well-formed XML 문서는  DOM 에서 트리 형태로 표현 - 2 가지 기본 모듈 제공      - minidom :  대부분 사용      - pulldom :  메모리가 부족하거나  XML 문서가 클때 사용 - DOM 에서 사용 되는 객체  (p. 344)
SAX (Simple API for XML) - 1 - XML  문서를 파싱 할 때 구성요소를 발견할 때 마다 이벤트를 발생시켜  XML  문서를 처리하는 방법 - XML  문서 내용을 변경 할 수 없음  (Read only) -  문서의 첫 부분에서 시작해 아래 부분으로 진행 ( 순차적 ) -  사용자는 원하는 요소 처리를 위한 함수를 생성하고 이벤트 핸들러에 함수를 연결 -  객체 기반 방식 (DOM)  보다는 빠르지만 한번 처리한 문서를 재사용 불가 -  이벤트 기반의 문서 처리 -  매우 큰  XML  문서를 처리 할 때 많이 사용 - xml.sax  메서드  (p.345)
SAX (Simple API for XML) - 2 - SAX  구성요소      -  리더 (Reader)          - XML Reader : SAX  파서들의 기본 클래스          - Locator :  문서 내부의 로케이터와  SAX  이벤트와 연결          - InputSource : XML  문서 인코딩을 파서에 알려줌          -  주로 사용하는 메소드  (p.346)      -  핸들러          -  컨텐츠 핸들러  :  도큐먼트 안의 정보를 파싱하면서 사용          - DTD  핸들러  : DTD  이벤트를 위한 핸들러          -  에러 핸들러  :  에러 혹은 경고 발생시 처리      - XML  문서
The ElementTree XML API - XML  문서의 엘리먼트를 파이썬의 리스트와 사전으로 다룰 수 있는 인터페이스를 제공
XML  문서 파싱하기  - 1 import xml.parsers.expat def start_element(name, attrs):      print('Start element:', name, attrs) def char_data(data):      print('Character data:', repr(data)) pa = xml.parsers.expat.ParserCreate() pa.StartElementHandler = start_element pa.CharacterDataHandler = char_data pa.Parse(&quot;&quot;&quot;<?xml version=&quot;1.0&quot;?><book ISBN=&quot;1111&quot;><title>Loving Python</title></book>&quot;&quot;&quot;) => result ('Start element:', u'book', {u'ISBN': u'1111'}) ('Start element:', u'title', {}) ('Character data:', &quot;u'Loving Python'&quot;)
XML  문서 파싱하기  - 2 from xml.dom.minidom import * xmlsrc = /slideshow/16-xml/10399746/&quot;&quot;&quot;<item> <name>test</name> </item> &quot;&quot;&quot; doc = parseString(xmlsrc) print(doc) print(doc.toxml()) => result <xml.dom.minidom.Document instance at 0x10bd515a8> <?xml version=&quot;1.0&quot; ?><item> <name>test</name> </item>
XML  문서 파싱하기  - 3 doc = parseString(xmlsrc) print(doc) print(doc.toxml()) a = doc.createElement(&quot;test&quot;) a.setAttribute(&quot;rrr&quot;, &quot;value&quot;) b = doc.createTextNode(&quot;addTextNode&quot;) a.appendChild(b) print(a.toxml()) => result [<DOM Element: name at 0x1039437a0>] 1 <test rrr=&quot;value&quot;>addTextNode</test>
XML  파일 로드  /  파싱 def LoadXMLFromFile():      fileName = str(input(&quot;please input file name to load : &quot;))      global xmlFD      try:          xmlFD = open(fileName)      except IOError:          print(&quot;invalid file name or path&quot;)          return None      else:          try:              dom = parse(xmlFD)          except Exception:              print(&quot;loading fail!!!&quot;)          else:              print(&quot;XML Document loading complete&quot;)              return dom      return None
노드 - DOM 에서 모든 컴포넌트들의 부모 클래스 -  하위 속성      -  엘리먼트 노트      -  속성 노드      -  텍스트 노드      -  기타 등등의 노드
노드 중요 메소드와 속성 - 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) :  현재노드를 복사해서 리턴
엘리먼트 - 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 과 매칭되는 속성이 이미 있다면 기존의 속성과 교체 ,  없다면 새로운 속성이 추가
엘리먼트 쉽게 다루기   - 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 로 인코딩
ElementTree  객체 - find(path) : path 에 매칭되는 엘리먼트들을 리턴 - getiterator([tag]) :  현재 엘리먼트의 하위 엘리먼트를 모두 가져옴 ,  만약  tag 가 지정되어 있으면  tag 에 해당하는 엘리먼트들만 리턴 - getroot() :  현재  XML 문서중 가장 상위 엘리먼트 객체를 리턴 - write(file[,encoding]) :  현재  ElementTree 객체를  file 에 저장합니다 . encoding 을
XML  문서를  HTML 로 변환하기 - p.363 - createDocument()  메서드를 이용해  DOM 객체를 생성 - HTML 의 태그가 될 엘리먼트들을 생성하고 생성된  DOM 객체에 삽입 -  리턴 값으로 생성한  DOM  객체를  XML 문자열로 반환
도서관리 프로그램 p.365~p.370

More Related Content

16장. XML 사용하기

  • 1. 16 장 . XML 사용하기
  • 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 문서
  • 9. The ElementTree XML API - XML 문서의 엘리먼트를 파이썬의 리스트와 사전으로 다룰 수 있는 인터페이스를 제공
  • 10. XML 문서 파싱하기 - 1 import xml.parsers.expat def start_element(name, attrs):      print('Start element:', name, attrs) def char_data(data):      print('Character data:', repr(data)) pa = xml.parsers.expat.ParserCreate() pa.StartElementHandler = start_element pa.CharacterDataHandler = char_data pa.Parse(&quot;&quot;&quot;<?xml version=&quot;1.0&quot;?><book ISBN=&quot;1111&quot;><title>Loving Python</title></book>&quot;&quot;&quot;) => result ('Start element:', u'book', {u'ISBN': u'1111'}) ('Start element:', u'title', {}) ('Character data:', &quot;u'Loving Python'&quot;)
  • 11. XML 문서 파싱하기 - 2 from xml.dom.minidom import * xmlsrc = /slideshow/16-xml/10399746/&quot;&quot;&quot;<item> <name>test</name> </item> &quot;&quot;&quot; doc = parseString(xmlsrc) print(doc) print(doc.toxml()) => result <xml.dom.minidom.Document instance at 0x10bd515a8> <?xml version=&quot;1.0&quot; ?><item> <name>test</name> </item>
  • 12. XML 문서 파싱하기 - 3 doc = parseString(xmlsrc) print(doc) print(doc.toxml()) a = doc.createElement(&quot;test&quot;) a.setAttribute(&quot;rrr&quot;, &quot;value&quot;) b = doc.createTextNode(&quot;addTextNode&quot;) a.appendChild(b) print(a.toxml()) => result [<DOM Element: name at 0x1039437a0>] 1 <test rrr=&quot;value&quot;>addTextNode</test>
  • 13. XML 파일 로드 / 파싱 def LoadXMLFromFile():      fileName = str(input(&quot;please input file name to load : &quot;))      global xmlFD      try:          xmlFD = open(fileName)      except IOError:          print(&quot;invalid file name or path&quot;)          return None      else:          try:              dom = parse(xmlFD)          except Exception:              print(&quot;loading fail!!!&quot;)          else:              print(&quot;XML Document loading complete&quot;)              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 문자열로 반환