파이썬 XML 다루는 법 (Python XML)
파이썬에서는 기본적으로 XML을 다루는 패키지를 제공합니다.
서드파티 라이브러리로 lxml이 있으나 여기서는 표준 XML 패키지를 이용해 보도록 하겠습니다.
XML 샘플 데이터 - users.xml
다음은 설명을 위한 xml 샘플 데이터이며, 때에 따라서 파일이 아닌 DB로부터 읽어온 XML 문자열일 수 있습니다.
회원 정보를 나타내며, 등급을 속성으로 가지며 이름, 나이, 생일을 값으로 가지고 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12 |
<users>
<user grade="gold">
<name>Kim Cheol Soo</name>
<age>25</age>
<birthday>19940215</birthday>
</user>
<user grade="diamond">
<name>Kim Yoo Mee</name>
<age>21</age>
<birthday>19980417</birthday>
</user>
</users> |
cs |
시작하기 - xml.etree.ElementTree Import
XML을 객체화 하기 위해서는 xml.etree.ElementTree이 필요하므로 import 합니다.
1 |
import xml.etree.ElementTree as elemTree |
cs |
XML객체로 파싱(Parse)하기
XML로 파싱하는 방법은 두 가지가 있습니다.
1. xml 파일형태로 존재하는 경우
2. xml 문자열 형태로 존재하는 경우
먼저 xml 파일로 존재하는 경우 파일 경로와 함께 parser() 메서드를 사용합니다.
1
2
3
4 |
import xml.etree.ElementTree as elemTree
tree = elemTree.parse('C:/users.xml') |
cs |
문자열 값으로 존재하는 경우 fromstring() 메서드에 xml 데이터 문자열을 넘깁니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 |
import xml.etree.ElementTree as elemTree
xmlStr = '''
<users>
<user grade="gold">
<name>Kim Cheol Soo</name>
<age>25</age>
<birthday>19940215</birthday>
</user>
<user grade="diamond">
<name>Kim Yoo Mee</name>
<age>21</age>
<birthday>19980417</birthday>
</user>
</users>
'''
tree = elemTree.fromstring(xmlStr) |
cs |
태그 검색하기 및 데이터 다루기
XML 데이터를 객체로 파싱한 이후 트리 안에서 각각의 태그를 검색할 수 있습니다.
다음 예제 소스를 보면 태그를 검색하고 속성과 자식 태그들의 값을 가져오는 방법을 알 수 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 |
import xml.etree.ElementTree as elemTree
tree = elemTree.parse('C:/users.xml')
user = tree.find('./user') #첫번째 user를 검색한 후 마침
print(user.tag) #tag name -> user
print(user.attrib) #{'grade' : 'gold'}
print(user.get('grade')) #attr value -> gold
userName = user.find('name') #<name></name> tag
print(userName.text) #Kim Cheol Soo |
cs |
태그 조건으로 검색하기
원하는 순번의 태그 가져오는 방법
1
2
3 |
tree = elemTree.fromstring(xmlStr)
user = tree.find('./user[2]') #두 번째 user |
cs |
특정 attribute를 가진 태그 가져오는 방법
1
2 |
tree.find('./user[@grade]') #grade attrib을 가진 첫 번째 user
tree.find('./user[@grade][2]') #grade attrib을 가진 두 번째 user |
cs |
특정 attrib의 특정 값을 가진 태그 가져오는 방법
1 |
tree.find('./user[@grade="diamond"]') #diamond 등급인 Kim Yoo Mee 태그 |
cs |
노드 XPath 표기법
./* #현재 노드의 하위 모든 태그
../ #부모 노드 |
cs |
태그 여러 개 한꺼번에 가져오기
태그를 배열로 findall() 메서드로 한꺼번에 가져올 수 있습니다.
1
2 |
for user in tree.findall('./user'):
print(user.tag) |
cs |
더욱 자세한 내용은 공식문서 참고
'Python' 카테고리의 다른 글
[Python] Jupyter Notebook(주피터 노트북) 설치 (0) | 2018.06.22 |
---|---|
[Python] 파이썬 기본 에디터 IDLE(Integrated Development and Learning Environment) (2) | 2018.06.17 |
[Python] 파이썬 URL 다루는 법 (Python urllib) (0) | 2018.03.23 |
[Python] 파이썬 URL Encoding 하는 방법. 한글 인코딩 하기 (2) | 2018.03.23 |
[Python] 파이썬 다운로드 및 설치하기 (0) | 2017.12.26 |