파이썬으로 XML 파싱하기

이 포스트에서는 파이썬에서 XML 데이터를 읽어들이는 방법을 설명합니다.

이전의 파이썬으로 간단한 XML 파일 만들기 포스트에서 예제로 다음과 같은 내용의 XML 문서를 만들었을 것입니다.

<?xml version="1.0" encoding="UTF-8"?>
<girlgroup>
  <name alias="GFRIEND">여자친구</name>
  <members>
    <member>소원</member>
    <member>예린</member>
    <member>은하</member>
    <member>유주</member>
    <member>신비</member>
    <member>엄지</member>
  </members>
  <albums>
    <album order="EP 1집">Season of Glass</album>
    <album order="EP 2집">Flower Bud</album>
    <album order="EP 3집">Snowflake</album>
    <album order="정규 1집">LOL</album>
  </albums>
</girlgroup>

이제 이 XML 문서를 파이썬으로 읽어들여서 읽기 좋은 데이터로 출력하는 프로그램을 작성해 봅시다. 이 예제의 XML 문서가 sample.xml 파일로 저장되었다고 코드를 작성합니다.

from lxml import etree

# Empty array
members = []
albums = []

# Load XML
tree = etree.parse("sample.xml")
root = tree.getroot()

# Get data
kids = root.getchildren()

for child in kids:
	if child.tag == "name":
		gname = child.text
	elif child.tag == "members":
		for x_member in child:
			members.append(x_member.text)
	elif child.tag == "albums":
		for x_album in child:
			albums.append([x_album.get("order"), x_album.text])

# Print
print("걸그룹 %s에 대한 정보는 다음과 같습니다:" % gname, end="\n\n")

print(" 멤버: ", end="")
for index, member in enumerate(members):
	if index > 0: print(", ", end="")
	print(member, end="")

print("\n\n [앨범 목록]")
for album in albums:
	print("  * %s: %s" % (album[0], album[1]) )

이제 이 코드를 설명해 보겠습니다.

1번째 줄에서는 XML 문서 생성 예제에서 나왔던 바와 같이 lxml 확장 라이브러리에서 etree 모듈을 불러옵니다. 파싱할 때에도 이 모듈을 사용하기 때문입니다.

4번째 줄과 5번째 줄은 멤버 목록과 앨범 목록을 저장할 배열을 미리 빈 배열로 정의해 두는 코드입니다.

8번째 줄에서 준비된 sample.xml 문서를 etree 모듈로 읽어서 파싱하여 tree 객체 변수에 대입한 후, 여기서 최상위 요소 부분을 root 객체 변수에 대입합니다. 데이터를 추출할 준비가 되었습니다.

12번째 줄은 최상위 요소인 girlgroup의 하위 요소들(name, members, albums)을 배열로 묶기 위하여 getchildren() 메소드를 써서 kids 객체 변수에 대입합니다. 그리고 14번 줄에서부터 kids의 각 원소를 child에 대입하면서 22번 줄까지 반복문을 수행합니다. 요소 이름을 검색해서 이름이 name일 경우 그 값을 gname에 대입하고, 이름이 members이거나 albums이면 그 안의 하위 요소들을 배열화하여 반복문을 수행합니다. members 배열에는 member 요소의 데이터값들을 대입하고, albus 배열에는 [“EP 1집”, “Season of Glass”] 식으로 order 속성값과 데이터값으로 이루어진 배열을 대입하여 2차원 배열 형태로 만듭니다.

대입이 끝났으면 이제 출력을 할 차례입니다. 25번 줄에서는 “걸그룹 %s에 대한 정보는 다음과 같습니다”에서 %s 자리에 gname에다 대입한 name 요소의 데이터값을 넣어서 출력하고, 그 다음으로 members 배열로 반복문을 수행하는데 enumerate() 함수를 이용하여 차례값(index)도 함께 추출합니다. 그 이유는 쉼표(,)를 보기 좋게 찍기 위하여 배열의 첫 번째 값이 아닌 경우 쉼표를 먼저 찍어주기 위함입니다. 그리고 이어서 members 배열의 원소값을 차례로 출력합니다. 이제 남은 것은 albums 배열 원소의 순차 출력입니다. members 출력 때와 방법은 같지만 2차원 배열로 저장되어 있다는 점이 차이가 있기에 albums의 각 원소를 album에 대입해서 album[0]과 album[1]로 나눠 출력하는 것입니다.

프로그램을 실행하여 보면 다음과 같이 표시될 것입니다.

걸그룹 여자친구에 대한 정보는 다음과 같습니다:

 멤버: 소원, 예린, 은하, 유주, 신비, 엄지

 [앨범 목록]
  * EP 1집: Season of Glass
  * EP 2집: Flower Bud
  * EP 3집: Snowflake
  * 정규 1집: LOL

이렇게 파싱된 XML 데이터가 표시되면 성공입니다.

“파이썬으로 XML 파싱하기”의 2개의 생각

답글 남기기

이메일 주소는 공개되지 않습니다.