점프 투 파이썬
»
A. 부록
»
02. XML 처리
파이썬으로 XML문서를 다루는 방법에 대해서 알아보자.
XML처리를 위한 파이썬 라이브러리들은 아주 많다. XML처리를 위한 대부분의 라이브러리는 아래문서에서 확인 할 수 있다.
ElementTree
이 곳에서는 가장 많은 사람들의 사랑을 받고 있는 ElementTree를 사용하는 방법에 대해서 다룬다.
ElementTree는 외부라이브러리로 존재하다가 파이썬 2.5부터 통합되었다. ElementTree는 Tkinter로 잘 알려진 프레드릭(Fredrik Lundh) 아저씨에 의해서 만들어진 XML 제너레이터 & 파서이다.
XML문서 생성하기
ElementTree를 이용하여 다음과 같은 구조의 XML문서를 생성해 보자.
<note date="20120104">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
다음과 같은 소스를 작성해 보자:
from elementtree.ElementTree import Element, dump
note = Element("note")
to = Element("to")
to.text = "Tove"
note.append(to)
dump(note)
위 소스의 실행 결과는 다음과 같다:
<note><to>Tove</to></note>
위와같이 Element를 이용하면 태그를 만들 수 있고 만들어진 태그에 텍스트값을 추가할 수 있음을 알 수 있다.
SubElement를 이용하면 조금 더 편리하게 태그를 추가할 수 있다:
from elementtree.ElementTree import Element, SubElement, dump
note = Element("note")
to = Element("to")
to.text = "Tove"
note.append(to)
SubElement(note, "from").text = "Jani"
dump(note)
결과는 다음과 같다:
<note><to>Tove</to><from>Jani</from></note>
SubElement는 태그명과 태그의 텍스트값을 한번에 설정할 수 있다.
다음과 같이 태그사이에 태그를 추가하거나 특정 태그를 삭제할 수도 있다:
dummy = Element("dummy")
note.insert(1, dummy)
note.remove(dummy)
위의 예는 dummy라는 태그를 삽입하고 삭제하는 것을 보여준다.
이번에는 note 태그에 attribute를 추가 해 보도록 하자:
from elementtree.ElementTree import Element, SubElement, dump
note = Element("note")
to = Element("to")
to.text = "Tove"
note.append(to)
SubElement(note, "from").text = "Jani"
note.attrib["date"] = "20120104"
dump(note)
note.attrib["date"]와 같은 방법으로 어트리뷰트값을 추가할 수 있었다.
다음과 같이 Element 생성 시 직접 attribute값을 추가하는 방법을 사용해도 된다:
note = Element("note", date="20120104")
결과는 다음과 같다:
<note date="20120104"><to>Tove</to><from>Jani</from></note>
이상과 같이 XML 태그와 어트리뷰트를 추가하는 방법에 대해서 알아보았다.
완성된 버전은 다음과 같다:
from elementtree.ElementTree import Element, SubElement, dump
note = Element("note")
note.attrib["date"] = "20120104"
to = Element("to")
to.text = "Tove"
note.append(to)
SubElement(note, "from").text = "Jani"
SubElement(note, "heading").text = "Reminder"
SubElement(note, "body").text = "Don't forget me this weekend!"
dump(note)
결과는 다음과 같다:
<note date="20120104"><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekend!</body></note>
위 결과값은 한줄로 이어져 있어 보기가 쉽지 않다.
정렬된 xml 값을 보기 쉽게 하기 위해 다음과 같이 indent 함수를 이용 해 보자:
from elementtree.ElementTree import Element, SubElement, dump
note = Element("note")
note.attrib["date"] = "20120104"
to = Element("to")
to.text = "Tove"
note.append(to)
SubElement(note, "from").text = "Jani"
SubElement(note, "heading").text = "Reminder"
SubElement(note, "body").text = "Don't forget me this weekend!"
def indent(elem, level=0):
i = "\n" + level*" "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
if not elem.tail or not elem.tail.strip():
elem.tail = i
for elem in elem:
indent(elem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
indent(note)
dump(note)
다음과 같이 정렬된 형태의 xml을 확인 할 수 있을 것이다:
<note date="20120104"> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>
이제 생성한 xml을 다음과 같이 Element의 write라는 메써도를 이용하여 파일에 write 해 보도록 하자:
ElementTree(note).write("note.xml")
note.xml이 생성된 것을 확인 할 수 있을 것이다
XML문서 파싱하기
이번에는 XML 생성과는 반대로 생성된 XML문서를 파싱하고 검색하는 방법에 대해서 알아보자.
XML문서는 다음과 같은 방법으로 파싱한다:
from elementtree.ElementTree import parse
tree = parse("note.xml")
note = tree.getroot()
ElementTree의 parse라는 함수를 이용하여 xml을 파싱할 수 있다.
어트리뷰트 값은 다음과 같이 읽을 수 있다:
print note.get("date")
print note.get("foo", "default")
print note.keys()
print note.items()
결과는 다음과 같다:
20120104
default
['date']
[('date', '20120104')]
어트리뷰트 값을 가져오는 방법은 딕셔너리와 동일함을 알 수 있다.
XML 태그에 접근하는 방법은 다음과 같다:
from_tag = note.find("from")
from_tags = note.findall("from")
from_text = note.findtext("from")
특정 태그의 모든 하위 엘리먼트를 순차적으로 처리할 때는 아래의 메써드를 사용한다:
childs = note.getiterator() childs = note.getchildren()
getiterator() 함수는 첫번째 인수로 다음과 같이 태그명을 받을 수도 있다:
note.getiterator("from")
위와 같은 경우 from태그의 하위 엘리먼트들이 순차적으로 리턴된다.
보통 다음과 같이 많이 사용된다:
for parent in tree.getiterator():
for child in parent:
... work on parent/child tuple
이상과 같이 파이썬에서 XML을 처리하기 위한 ElementTree의 사용방법에 대해서 간략히 알아보았다.
이보다 더 쉬운 XML 라이브러리가 있을까? 있다면 이곳에 소개시켜 주시기를.. ^^
Fredrik Lundh 가 직접 작성한 튜토리얼을 꼭 읽어보도록 하자.
정말로 삭제하시겠습니까?
인터넷 익스플로러6는 지원하지 않습니다.