16장. XML 사용하기
Upcoming SlideShare
Loading in...5
×
 

16장. XML 사용하기

on

  • 1,337 views

 

Statistics

Views

Total Views
1,337
Views on SlideShare
1,337
Embed Views
0

Actions

Likes
0
Downloads
0
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    16장. XML 사용하기 16장. XML 사용하기 Presentation Transcript

    • 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 = &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