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
'programing' 카테고리의 다른 글
Angular에서 클릭 이벤트를 시뮬레이션하려면 어떻게 해야 합니까?JS 지시 테스트? (0) | 2023.04.05 |
---|---|
테이블에서 모든 열과 ROWNUM 등의 추가 열을 선택하려면 어떻게 해야 합니까? (0) | 2023.04.05 |
jq를 사용하여 기존 JSON 어레이에 새 요소 추가 (0) | 2023.04.05 |
JQuery 오류:수집되지 않은 유형 오류: 개체 번호에 메서드 'ready'가 없습니다. (0) | 2023.04.05 |
$$(더블 달러 기호)는 어떤 용도로 사용됩니까? (0) | 2023.04.05 |