📕🐘 도로락 - 코끼리를 냉장고에 넣는 방법
Python | 2018. 3. 23. 00:08

[Python] 파이썬 XML 다루는 법 (Python XML)

파이썬 XML 다루는 법 (Python XML)

파이썬에서는 기본적으로 XML을 다루는 패키지를 제공합니다.

서드파티 라이브러리로 lxml이 있으나 여기서는 표준 XML 패키지를 이용해 보도록 하겠습니다.

XML 샘플 데이터 - users.xml

다음은 설명을 위한 xml 샘플 데이터이며, 때에 따라서 파일이 아닌 DB로부터 읽어온 XML 문자열일 수 있습니다.

회원 정보를 나타내며, 등급을 속성으로 가지며 이름, 나이, 생일을 값으로 가지고 있습니다.

<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>

시작하기 - xml.etree.ElementTree Import

XML을 객체화 하기 위해서는 xml.etree.ElementTree이 필요하므로 import 합니다.

import xml.etree.ElementTree as elemTree

XML객체로 파싱(Parse)하기

XML로 파싱하는 방법은 두 가지가 있습니다.

  1. xml 파일형태로 존재하는 경우
  2. xml 문자열 형태로 존재하는 경우

먼저 xml 파일로 존재하는 경우 파일 경로와 함께 parser() 메서드를 사용합니다.

import xml.etree.ElementTree as elemTree


tree = elemTree.parse('C:/users.xml')

문자열 값으로 존재하는 경우 fromstring() 메서드에 xml 데이터 문자열을 넘깁니다.

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)

태그 검색하기 및 데이터 다루기

XML 데이터를 객체로 파싱한 이후 트리 안에서 각각의 태그를 검색할 수 있습니다.

다음 예제 소스를 보면 태그를 검색하고 속성과 자식 태그들의 값을 가져오는 방법을 알 수 있습니다.

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

태그 조건으로 검색하기

원하는 순번의 태그 가져오는 방법

tree = elemTree.fromstring(xmlStr) 

user = tree.find('./user[2]') #두 번째 user

특정 attribute를 가진 태그 가져오는 방법

tree.find('./user[@grade]') #grade attrib을 가진 첫 번째 user
tree.find('./user[@grade][2]') #grade attrib을 가진 두 번째 user

특정 attrib의 특정 값을 가진 태그 가져오는 방법

tree.find('./user[@grade="diamond"]') #diamond 등급인 Kim Yoo Mee 태그

노드 XPath 표기법

./* #현재 노드의 하위 모든 태그
../ #부모 노드

태그 여러 개 한꺼번에 가져오기

태그를 배열로 findall() 메서드로 한꺼번에 가져올 수 있습니다.

for user in tree.findall('./user'):
    print(user.tag)

더욱 자세한 내용은 공식문서 참고

https://docs.python.org/3.4/library/xml.etree.elementtree.html

도로락

도로락

Writer

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