파이썬으로 XML 처리하기
목차
📌 ElementTree를 이용하여 다음과 같은 구조의 XML 문서를 생성해 보자.
<note data="20170725">
<to>Tove</to>
<from>Jani</from>
<headin>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
다음과 같은 소스를 작성한다.
위 소스의 실행 결과는 다음과 같다.
<note><to>Tove</to></note>
엘리먼트(Element)를 이용하면 태그를 만들 수 있고, 만들어진 태그에 텍스트 값을 추가할 수 있다.
📌 서브엘리먼트(SubElement)를 이용하면 조금 더 편리하게 태그를 추가할 수 있다.
실행 결과는 다음과 같다.
<note><to>Tove</to><from>Jani</from></note>
서브엘리먼트는 태그명과 태그의 텍스트 값을 한 번에 설정할 수 있다. 또는 다음과 같이 태그 사이에 태그를 추가하거나 특정 태그를 삭제할 수도 있다.
위의 예는 dummy라는 태그를 삽입하고 삭제하는 경우이다.
📌 note 태그에 애트리뷰트(attribute)를 추가해 본다.
다음과 같이 엘리먼트 생성 시 직접 애트리뷰트 값을 추가하는 방법을 사용해도 된다.
note = Element("note", data = "20170725")
실행 결과는 다음과 같다.
<note data="20170725"><to>Tove</to><from>Jani</from></note>
완성된 소스는 다음과 같다.
실행 결과는 다음과 같다.
<note><to>Tove</to><from>Jani</from><heading>Reminder</heading><body>Don't forget me this weekned</body></note>
📌 정렬된 형태의 xml 값을 보려면 다음과 같이 indent 함수를 사용해 보자.
indent 함수를 이용하면 다음과 같이 정렬된 형태의 xml 값을 확인할 수 있다.
<note data="20170725">
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
from xml.etree.ElkementTree import ElementTree
ElementTree(note).write("note.xml")
note.xml이 생성되는 것을 확인할 수 있다.
📌 생성된 XML 문서를 파싱(parsing)하고 검색하는 방법에 대해서 알아본다.
from xml.etree.ElementTree import parse
tree = parse("note.xml")
note = tree.getroot()
ElementTree의 parse라는 함수를 이용하여 xml을 파싱할 수 있다.
get 메서드는 애트리뷰트의 값을 읽는다. 만약 두 번째 입력 인수로 디폴트 값을 주었다면 첫 번째 인자에 해당되는 애트리뷰트 값이 없을 경우 두 번째 값을 리턴한다.
keys는 모든 애트리뷰트의 키 값을 리스트로 리턴하고, items는 key, value 쌍을 리턴한다. 애트리뷰트 값을 가져오는 방법은 앞에서 배운 딕셔너리와 동일함을 알 수 있다.
결과는 다음과 같다.
20170725
default
['data']
[('data', '20170725')]
📌 XML 태그에 접근하는 방법은 다음과 같다.
from_tag = note.find("from")
from_tags = note.findall("from")
from_text = note.findtext("from")
note.find("from")은 note 태그 하위에 from과 일치하는 첫 번째 태그를 찾아서 리턴하고, 없으면 None을 리턴한다. note.findall("from")은 note 태그 하위에 from과 일치하는 모든 태그를 리스트로 리턴한다. note.findtext("from")은 note 태그 하위에 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
[Python Django 설치 및 프로젝트 만들기 (feat.pip) (0) | 2017.08.10 |
---|---|
Python 주소록 프로젝트 (0) | 2017.07.25 |
Python 정규 표현식 심화 (0) | 2017.07.25 |
Python 정규 표현식 시작하기 (0) | 2017.07.24 |
Python 정규 표현식 살펴보기 (0) | 2017.07.24 |