파이썬 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




더욱 자세한 내용은 공식문서 참고
블로그 이미지

도로락

IT, 프로그래밍, 컴퓨터 활용 정보 등을 위한 블로그

,