Python 딕셔너리 XML 변환 방법 2가지

이 글은 Python 딕셔너리 XML 변환 방법에 대해 간단히 소개합니다. xml.etree.ElementTree 모듈과 xmltodict 모듈을 사용한 방법을 다루며, 변환 시 주의할 점도 함께 살펴봅니다. 이를 통해 Python에서 두 데이터 구조 간의 변환을 쉽게 이해하고 활용할 수 있게 됩니다.

Python 딕셔너리 XML 변환 개요

Python은 다양한 데이터 형식을 지원하며, 그 중에서도 딕셔너리(Dictionary)와 XML은 매우 널리 사용되는 데이터 구조입니다. 딕셔너리는 키-값 쌍으로 데이터를 저장하는 구조로, 빠르고 간편하게 데이터를 검색하고 관리할 수 있습니다. 반면, XML(Extensible Markup Language)은 주로 데이터를 계층 구조로 표현하는 데 사용되며, 특히 웹 서비스와 데이터 전송에서 자주 활용됩니다. 이러한 두 가지 데이터 형식을 상호 변환하는 방법을 알아두면 다양한 상황에서 매우 유용하게 활용할 수 있습니다.

Python에서 딕셔너리와 XML의 차이점

딕셔너리와 XML은 그 구조와 용도가 다릅니다. 딕셔너리는 키와 값으로 이루어진 데이터 구조로, 중첩된 데이터 구조도 쉽게 표현할 수 있습니다. 예를 들어, 다음과 같은 딕셔너리가 있을 수 있습니다:

data = {
    "name": "윤석산",
    "age": 87,
    "address": {
        "street": "유머1번길37 생태쉐르빌 301호",
        "city": "서울"
    }
}
Python

반면, XML은 데이터의 계층적 구조를 태그로 표현합니다. 위의 딕셔너리를 XML로 변환하면 다음과 같은 형태가 됩니다:

<root>
	<name>윤석산</name>
	<age>87</age>
	<address>
		<street>유머1번길37 생태쉐르빌 301호</street>
		<city>서울</city>
	</address>
</root>
Python

딕셔너리와 XML의 주요 차이점은 딕셔너리가 비선형적인 구조인 반면, XML은 계층적인 구조라는 점입니다. 따라서 딕셔너리를 XML로 변환하는 과정에서는 이러한 구조적 차이를 고려해야 합니다.

Python 딕셔너리 XML 변환 방법

Python에서 딕셔너리를 XML로 변환하는 데에는 여러 가지 방법이 있습니다. 가장 일반적인 방법 중 하나는 xml.etree.ElementTree 모듈을 사용하는 것입니다. 이 모듈은 XML 데이터를 생성, 파싱, 조작할 수 있는 다양한 기능을 제공합니다.

기본적인 딕셔너리에서 XML로의 변환

xml.etree.ElementTree 모듈을 사용하여 딕셔너리를 XML로 변환하는 기본적인 방법은 다음과 같습니다:

import xml.etree.ElementTree as ET

def dict_to_xml(tag, d):
    elem = ET.Element(tag)
    for key, val in d.items():
        child = ET.Element(key)
        child.text = str(val)
        elem.append(child)
    return elem

data = {
    "name": "윤석산",
    "age": 87,
    "address": {
        "street": "유머1번길37 생태쉐르빌 301호",
        "city": "서울"
    }
}

root = dict_to_xml('root', data)
tree = ET.ElementTree(root)
ET.indent(tree, space="\t", level=0)
tree.write("output.xml", encoding="utf8")
Python

위의 코드에서 dict_to_xml 함수는 딕셔너리를 XML로 변환하는 역할을 합니다. ET.Element를 사용하여 루트 요소와 하위 요소를 생성하고, 각 딕셔너리 항목을 XML 태그로 변환합니다. 마지막으로, ElementTree를 사용하여 XML 파일로 저장할 수 있습니다.

저장한 xml 파일은 다음과 같습니다. 그런데 뭔가 생각한 대로 되지 않은 것 같은 문제가 보이죠? street과 city가 그냥 딕셔너리 형태의 텍스트로 address 태그 안에 들어가 있습니다. 이 문제를 해결해 보도록 하겠습니다.

그림 1. Python 딕셔너리 XML 변환: 일부 변환되지 않고 딕셔너리가 문자열로 들어감
그림 1. Python 딕셔너리 XML 변환: 일부 변환되지 않고 딕셔너리가 문자열로 들어감

중첩된 딕셔너리 처리

딕셔너리가 중첩된 구조일 경우, 이를 처리하는 방법은 약간 더 복잡해집니다. 위의 기본 예제에서 중첩된 address 딕셔너리를 처리하는 방법을 다음과 같이 확장해 보겠습니다.

def dict_to_xml(tag, d):
    elem = ET.Element(tag)
    for key, val in d.items():
        if isinstance(val, dict):
            child = dict_to_xml(key, val)
        else:
            child = ET.Element(key)
            child.text = str(val)
        elem.append(child)
    return elem
Python

이제 dict_to_xml 함수는 값이 딕셔너리일 경우 재귀적으로 호출되어 중첩된 구조도 처리할 수 있습니다. 이 방법을 통해 중첩된 딕셔너리를 XML로 변환할 때 발생하는 문제를 해결할 수 있습니다.

새로운 dict_to_xml 함수로 교체하면 아래와 같이 원하는 결과를 얻을 수 있습니다.

그림 2. Python 딕셔너리 XML 변환: xml.etree.ElementTree로 변환
그림 2. Python 딕셔너리 XML 변환: xml.etree.ElementTree로 변환

xmltodict 모듈을 사용한 변환

또 다른 방법으로는 xmltodict 모듈을 사용할 수 있습니다. 이 모듈은 XML과 딕셔너리 간의 변환을 더욱 간단하게 처리할 수 있는 도구를 제공합니다. xmltodict 모듈을 설치하고 사용하는 방법은 다음과 같습니다:

pip install xmltodict
ShellScript

설치 후, 다음과 같이 딕셔너리를 XML로 변환할 수 있습니다:

import xmltodict

data = {
    "name": "윤석산",
    "age": 87,
    "address": {
        "street": "유머1번길37 생태쉐르빌 301호",
        "city": "서울"
    }
}

xml_data = xmltodict.unparse({"root": data}, pretty=True)
print(xml_data)
Python

xmltodict.unparse 메서드는 딕셔너리를 XML로 변환하며, pretty=True 옵션을 사용하면 가독성 높은 형태로 출력됩니다. 이 방법은 매우 간편하며, 복잡한 딕셔너리를 다룰 때 유용합니다.

그림 3. Python 딕셔너리 XML 변환: xmltodict 모듈을 사용하여 변환
그림 3. Python 딕셔너리 XML 변환: xmltodict 모듈을 사용하여 변환

주의할 점

Python에서 딕셔너리를 XML로 변환할 때 주의해야 할 몇 가지 사항이 있습니다:

  1. 데이터 타입: 딕셔너리의 값이 숫자, 문자열, 리스트 등 다양한 데이터 타입일 수 있습니다. XML은 기본적으로 문자열 데이터를 다루기 때문에, 변환 과정에서 숫자나 다른 데이터 타입은 문자열로 변환되어야 합니다.
  2. 특수 문자: XML에서는 <, >, & 등의 특수 문자가 사용되기 때문에, 딕셔너리의 값에 이러한 문자가 포함되어 있을 경우 적절히 인코딩해야 합니다.
  3. 루트 태그: XML 문서에는 반드시 하나의 루트 태그가 있어야 합니다. 딕셔너리를 XML로 변환할 때, 루트 태그를 명시적으로 지정하지 않으면 XML 구조가 올바르지 않을 수 있습니다.
  4. 중복 키: 딕셔너리는 중복된 키를 허용하지 않지만, XML에서는 같은 이름의 태그가 여러 번 나타날 수 있습니다. 이러한 경우, 딕셔너리 구조를 변형하거나 리스트로 처리해야 합니다.

정리

Python 딕셔너리 XML 변환 방법 2가지를 살펴보았습니다. 각각의 방법에는 장단점이 있습니다. xml.etree.ElementTree 모듈을 사용하면 보다 세밀한 제어가 가능하지만, 코드가 다소 복잡할 수 있습니다. 반면, xmltodict 모듈을 사용하면 간편하게 변환할 수 있지만, 세부적인 조정이 어렵습니다.

딕셔너리와 XML의 구조적 차이를 이해하고, 변환 과정에서 발생할 수 있는 문제들을 미리 파악하는 것이 중요합니다. 이 글에서 다룬 내용을 바탕으로, 다양한 상황에서 딕셔너리를 XML로 변환하는 데 필요한 기본적인 지식을 습득할 수 있을 것입니다.

관련 자료

같이 읽으면 좋은 글

Leave a Comment