programing

Python에서 XML을 JSON으로 변환하는 방법은 무엇입니까?

css3 2023. 4. 5. 22:07

Python에서 XML을 JSON으로 변환하는 방법은 무엇입니까?

중복 가능성:
Python을 사용하여 XML을 JSON으로 변환하시겠습니까?

App Engine에서 작업 중인데 원격 서버에서 검색 중인 XML 문서를 동등한 JSON 개체로 변환해야 합니다.

사용하고 있다xml.dom.minidom에서 반환되는 XML 데이터를 해석하다urlfetch. 저도 사용하려고 합니다.django.utils.simplejson해석된 XML 문서를 JSON으로 변환합니다.그 둘을 어떻게 엮어야 할지 난감하다.다음은 제가 만지작거리는 코드입니다.

from xml.dom import minidom
from django.utils import simplejson as json

#pseudo code that returns actual xml data as a string from remote server. 
result = urlfetch.fetch(url,'','get');

dom = minidom.parseString(result.content)
json = simplejson.load(dom)

self.response.out.write(json)

xmltodict(완전 공개:이 "표준"에 따라 XML을 dict+list+string 구조로 변환할 수 있습니다.Expat 기반이므로 매우 빠르고 XML 트리 전체를 메모리에 로드할 필요가 없습니다.

데이터 구조를 갖추면 JSON에 시리얼화할 수 있습니다.

import xmltodict, json

o = xmltodict.parse('<e> <a>text</a> <a>text</a> </e>')
json.dumps(o) # '{"e": {"a": ["text", "text"]}}'

lxml objectify에 대한 Soviut의 조언은 좋습니다.특별히 하위 분류된 simplejson을 사용하면 lxml 객체화 결과를 json으로 변환할 수 있습니다.

import simplejson as json
import lxml

class objectJSONEncoder(json.JSONEncoder):
  """A specialized JSON encoder that can handle simple lxml objectify types
      >>> from lxml import objectify
      >>> obj = objectify.fromstring("<Book><price>1.50</price><author>W. Shakespeare</author></Book>")       
      >>> objectJSONEncoder().encode(obj)
      '{"price": 1.5, "author": "W. Shakespeare"}'       
 """


    def default(self,o):
        if isinstance(o, lxml.objectify.IntElement):
            return int(o)
        if isinstance(o, lxml.objectify.NumberElement) or isinstance(o, lxml.objectify.FloatElement):
            return float(o)
        if isinstance(o, lxml.objectify.ObjectifiedDataElement):
            return str(o)
        if hasattr(o, '__dict__'):
            #For objects with a __dict__, return the encoding of the __dict__
            return o.__dict__
        return json.JSONEncoder.default(self, o)

사용 예에 대해서는 docstring을 참조해 주십시오.기본적으로 lxml의 결과를 전달합니다.objectify의 인스턴스의 부호화 메서드에 대응합니다.objectJSONEncoder

Koen의 요점은 여기서 매우 유효합니다.위의 솔루션은 단순히 중첩된 xml에만 적용되며 루트 요소의 이름은 포함되지 않습니다.이건 고쳐질 수 있어

저는 이 수업을 요지에 포함시켰습니다.http://gist.github.com/345559

XML 포맷은 매우 다양하기 때문에 매우 엄격한 XML 포맷이 없으면 이 기능을 수행할 수 있는 코드를 작성하는 것은 불가능하다고 생각합니다.제 뜻은 다음과 같습니다.

<persons>
    <person>
        <name>Koen Bok</name>
        <age>26</age>
    </person>
    <person>
        <name>Plutor Heidepeen</name>
        <age>33</age>
    </person>
</persons>

될 것이다

{'persons': [
    {'name': 'Koen Bok', 'age': 26},
    {'name': 'Plutor Heidepeen', 'age': 33}]
}

하지만 이게 뭘까요?

<persons>
    <person name="Koen Bok">
        <locations name="defaults">
            <location long=123 lat=384 />
        </locations>
    </person>
</persons>

제 말이 무슨 말인지 알겠어요?

편집: 다음 문서를 찾았습니다.http://www.xml.com/pub/a/2006/05/31/converting-between-xml-and-json.html

Jacob Smullyan은 effob's Element를 사용하는 pesterfish라는 유틸리티를 썼다.XML을 JSON으로 변환하는 트리입니다.

Objectify 또는 Element를 사용할 수 있습니다.lxml 모듈의 트리.이전 버전 요소트리는 python xml.etree 모듈에서도 사용할 수 있습니다.둘 중 하나는 xml을 Python 개체로 변환하고, 그 후 simplejson을 사용하여 개체를 JSON으로 직렬화할 수 있습니다.

이것은 귀찮은 중간 단계처럼 보일 수 있지만 XML 개체와 일반 Python 개체를 모두 다룰 때는 더욱 의미가 있습니다.

일반적으로 XML에서 언어의 일반 개체로 전환해야 합니다(보통 이를 위한 합리적인 도구가 있으며 변환이 더 어렵기 때문입니다).그리고 Plain Old Object에서 JSON을 생성합니다.이 툴도 있습니다.이것은 매우 간단한 시리얼라이제이션입니다(JSON은 오브젝트 시리얼라이제이션에 자연스럽게 적합합니다).Python은 툴 세트를 가지고 있을 겁니다.

pesterfesh를 기반으로 한 작은 명령줄 기반의 Python 스크립트를 작성했습니다.이 스크립트는 다음과 같습니다.

https://github.com/hay/xml2json

언급URL : https://stackoverflow.com/questions/471946/how-to-convert-xml-to-json-in-python