파이썬 XML에서 JSON, Dict로 변환하기

오늘은 XML을 JSON 및 Dict로 변환하는 방법을 배우게 될 것입니다. Python에서는 xmltodict 모듈을 사용하여 XML 파일을 읽고 Dict 또는 JSON 데이터로 변환할 수 있습니다. 또한 큰 XML 파일을 스트리밍하고 이를 딕셔너리로 변환할 수도 있습니다. 코딩 부분에 들어가기 전에 먼저 XML 변환이 왜 필요한지 이해해 봅시다.

XML을 Dict/JSON으로 변환

XML 파일은 천천히 사용되지 않게 되었지만 웹의 여전히 이 형식을 사용하는 대규모 시스템이 있습니다. XML은 JSON보다 무겁기 때문에 대부분의 개발자들은 응용 프로그램에서 후자를 선호합니다. 어떤 소스에서 제공된 XML을 이해해야 하는 경우, 이를 JSON으로 변환하는 작업은 지루한 작업일 수 있습니다. Python의 xmltodict 모듈은 이 작업을 매우 쉽고 간단하게 수행할 수 있도록 해줍니다.

xmltodict로 시작하기

pip을 주로 사용하여 먼저 xmltodict 모듈을 설치해야 합니다.

xmltodict 모듈 설치

다음은 Python Package Index (pip)를 사용하여 xmltodict 모듈을 설치하는 방법입니다:

pip install xmltodict

이 작업은 xmltodict가 매우 가볍기 때문에 빠르게 수행됩니다. 이 설치에 대한 출력은 다음과 같습니다: 이 설치의 가장 좋은 점은 이 모듈이 다른 외부 모듈에 의존하지 않으므로 가벼우며 버전 충돌을 피합니다. 간단히 설명하면, 데비안 기반 시스템에서는 다음과 같이 apt 도구를 사용하여 이 모듈을 쉽게 설치할 수 있습니다:

sudo apt install python-xmltodict

또 다른 장점은 이 모듈에 공식 데비안 패키지가 있다는 것입니다.

Python XML을 JSON으로

이 모듈을 시도하기에 가장 좋은 곳은 주로 수행하도록 설계된 작업을 수행하는 것입니다. XML을 JSON으로 변환하는 작업을 수행해 보겠습니다. 이 작업을 수행하는 코드 스니펫을 살펴보겠습니다:

import xmltodict
import pprint
import json

my_xml = """
    <audience>
      <id what="attribute">123</id>
      <name>Shubham</name>
    </audience>
"""

pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(xmltodict.parse(my_xml)))

프로그램의 출력을 확인해 봅시다: 여기서는 단순히 XML 데이터를 JSON으로 변환하는 parse(...) 함수를 사용하고, 그런 다음 json 모듈을 사용하여 JSON을 더 나은 형식으로 출력합니다.

XML 파일을 JSON으로 변환하기

XML 데이터를 코드 자체에 유지하는 것은 항상 가능한 것이 아니며 현실적이지도 않습니다. 보통은 데이터를 데이터베이스나 파일에 유지합니다. 파일을 직접 선택하여 JSON으로 변환할 수도 있습니다. XML 파일로 변환하는 방법에 대한 코드 조각을 살펴보겠습니다:

import xmltodict
import pprint
import json

with open('person.xml') as fd:
    doc = xmltodict.parse(fd.read())

pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))

프로그램의 출력을 확인해 봅시다: 여기서는 다른 모듈인 pprint를 사용하여 출력을 형식화하였습니다. 그 외에도, open(...) 함수를 사용하는 것은 간단했습니다. 파일 디스크립터를 얻고 파일을 JSON 객체로 파싱했습니다.

Python XML을 Dict로 변환

모듈 이름이 암시하는 대로, xmltodict는 실제로 제공한 XML 데이터를 간단한 파이썬 딕셔너리로 변환합니다. 따라서 딕셔너리 키를 사용하여 데이터에 쉽게 액세스할 수 있습니다. 다음은 샘플 프로그램입니다:

import xmltodict
import pprint
import json

my_xml = """
    <audience>
      <id what="attribute">123</id>
      <name>Shubham</name>
    </audience>
"""
my_dict = xmltodict.parse(my_xml)
print(my_dict['audience']['id'])
print(my_dict['audience']['id']['@what'])

이 프로그램의 출력을 확인해보겠습니다: 따라서 태그는 키로 사용될 수 있으며 속성 키도 동일하게 사용될 수 있습니다. 속성 키는 @ 기호로 접두사를 붙이면 됩니다.

XML에서 네임스페이스 지원

XML 데이터에서는 일반적으로 XML 파일에서 제공하는 데이터의 범위를 정의하는 네임스페이스 집합이 있습니다. JSON 형식으로 변환할 때 이러한 네임스페이스가 JSON 형식에도 유지되어야 할 필요가 있습니다. 다음은 이에 대한 샘플 XML 파일입니다:

<root xmlns="https://defaultns.com/"
        xmlns:a="https://a.com/">
    <audience>
        <id what="attribute">123</id>
        <name>Shubham</name>
    </audience>
</root>

다음은 JSON 형식에 XML 네임스페이스를 포함하는 방법에 대한 샘플 프로그램입니다:

import xmltodict
import pprint
import json

with open('person.xml') as fd:
    doc = xmltodict.parse(fd.read(), process_namespaces=True)

pp = pprint.PrettyPrinter(indent=4)
pp.pprint(json.dumps(doc))

이 프로그램의 출력을 확인해보겠습니다:

JSON에서 XML로 변환

비록 XML에서 JSON으로 변환하는 것이이 모듈의 주요 목표이지만 xmltodict는 JSON을 XML 형식으로 역변환하는 작업도 지원합니다. 프로그램 자체에서 JSON 데이터를 제공할 것입니다. 여기 샘플 프로그램이 있습니다:

import xmltodict

student = {
  "data" : {
    "name" : "Shubham",
    "marks" : {
      "math" : 92,
      "english" : 99
    },
    "id" : "s387hs3"
  }
}

print(xmltodict.unparse(student, pretty=True))

이 프로그램의 출력을 살펴보겠습니다: 이 작업이 올바르게 작동하려면 단일 JSON 키를 지정하는 것이 필요합니다. 프로그램을 수정하여 데이터의 첫 번째 수준에 여러 JSON 키를 포함하도록 한다면 다음과 같습니다:

import xmltodict

student = {
    "name" : "Shubham",
    "marks" : {
        "math" : 92,
        "english" : 99
    },
    "id" : "s387hs3"
}

print(xmltodict.unparse(student, pretty=True))

이 경우 루트 수준에 세 개의 키가 있습니다. 이 형식의 JSON을 분석하려고하면이 오류가 발생합니다: 이는 xmltodict가 JSON을 첫 번째 키로 루트 XML 태그를 구성해야하기 때문에 발생합니다. 즉, 데이터의 루트 수준에는 단일 JSON 키만 있어야합니다.

결론

이 수업에서는 XML을 JSON으로 구문 분석하고 변환하는 데 사용할 수있는 훌륭한 Python 모듈을 공부했습니다. 또한 xmltodict 모듈을 사용하여 XML을 Dict로 변환하는 방법을 배웠습니다. 참고: API 문서

Source:
https://www.digitalocean.com/community/tutorials/python-xml-to-json-dict