웹에서 부적절한 XML-> JSON 코드가 상당히 많이 보이며 Stack 사용자와 약간의 상호 작용을 하면서이 군중이 Google 결과의 처음 몇 페이지 이상을 도울 수 있다고 확신합니다.
따라서 날씨 피드를 파싱하고 있으며 수많은 웹 사이트에서 날씨 위젯을 채워야합니다. 우리는 지금 파이썬 기반 솔루션을 찾고 있습니다.
이 공개 weather.com RSS 피드 는 우리가 분석 할 내용의 좋은 예입니다 ( 실제 weather.com 피드에는 파트너 관계로 인해 추가 정보가 포함되어 있습니다 ).
간단히 말해서 파이썬을 사용하여 XML을 JSON으로 어떻게 변환해야합니까?
답변
XML과 JSON간에 “일대일”매핑이 없으므로 하나를 다른 것으로 변환하려면 결과 로 수행 하려는 작업을 이해해야 합니다.
파이썬의 표준 라이브러리에는 XML (DOM, SAX 및 ElementTree 포함) 을 파싱하기위한 여러 모듈이 있습니다. Python 2.6부터 Python 데이터 구조를 JSON으로 또는 JSON으로 변환하는 기능이 json
모듈에 포함되어 있습니다.
인프라가 있습니다.
답변
xmltodict (전체 공개 : 필자가 작성)는이 “standard”에 따라 XML을 dict + list + string 구조로 변환하는 데 도움이 됩니다. 그것은이다 국외 거주자는 그래서 매우 빨리 메모리에 전체 XML 트리를로드 할 필요가 없습니다, 기반.
해당 데이터 구조가 있으면 JSON으로 직렬화 할 수 있습니다.
import xmltodict, json
o = xmltodict.parse('<e> <a>text</a> <a>text</a> </e>')
json.dumps(o) # '{"e": {"a": ["text", "text"]}}'
답변
xmljson 라이브러리를 사용하여 다른 XML JSON 규칙을 사용하여 변환 할 수 있습니다 .
예를 들어이 XML은 다음과 같습니다.
<p id="1">text</p>
BadgerFish 규칙 을 통해 다음과 같이 변환됩니다 .
{
'p': {
'@id': 1,
'$': 'text'
}
}
그리고 GData 규칙 을 통해 (속성은 지원되지 않습니다) :
{
'p': {
'$t': 'text'
}
}
… 그리고 Parker 규칙 을 통해 (속성은 지원되지 않습니다) :
{
'p': 'text'
}
동일한 규칙을 사용하여 XML에서 JSON으로, JSON에서 XML로 변환 할 수 있습니다.
>>> import json, xmljson
>>> from lxml.etree import fromstring, tostring
>>> xml = fromstring('<p id="1">text</p>')
>>> json.dumps(xmljson.badgerfish.data(xml))
'{"p": {"@id": 1, "$": "text"}}'
>>> xmljson.parker.etree({'ul': {'li': [1, 2]}})
# Creates [<ul><li>1</li><li>2</li></ul>]
공개 : 나는이 도서관을 썼다. 미래의 검색 자들에게 도움이되기를 바랍니다.
답변
언젠가 모든 데이터 대신 응답 코드 만 얻는다면 json 구문 분석과 같은 오류가 발생 하므로 텍스트 로 변환해야 합니다
import xmltodict
data = requests.get(url)
xpars = xmltodict.parse(data.text)
json = json.dumps(xpars)
print json
답변
여기에 내가 작성한 코드가 있습니다. 내용을 파싱하지 않고 평범한 변환 만하면됩니다.
from xml.dom import minidom
import simplejson as json
def parse_element(element):
dict_data = dict()
if element.nodeType == element.TEXT_NODE:
dict_data['data'] = element.data
if element.nodeType not in [element.TEXT_NODE, element.DOCUMENT_NODE,
element.DOCUMENT_TYPE_NODE]:
for item in element.attributes.items():
dict_data[item[0]] = item[1]
if element.nodeType not in [element.TEXT_NODE, element.DOCUMENT_TYPE_NODE]:
for child in element.childNodes:
child_name, child_dict = parse_element(child)
if child_name in dict_data:
try:
dict_data[child_name].append(child_dict)
except AttributeError:
dict_data[child_name] = [dict_data[child_name], child_dict]
else:
dict_data[child_name] = child_dict
return element.nodeName, dict_data
if __name__ == '__main__':
dom = minidom.parse('data.xml')
f = open('data.json', 'w')
f.write(json.dumps(parse_element(dom), sort_keys=True, indent=4))
f.close()
답변
XML 기반 마크 업을 JSON으로 전송하여 손실없이 원래 형식으로 다시 변환 할 수있는 방법이 있습니다. http://jsonml.org/를 참조하십시오 .
일종의 XSLT JSON입니다. 도움이 되었기를 바랍니다.
답변
여전히 이것이 필요할 수있는 사람에게. 이 변환을 수행하는 새롭고 간단한 코드가 있습니다.
from xml.etree import ElementTree as ET
xml = ET.parse('FILE_NAME.xml')
parsed = parseXmlToJson(xml)
def parseXmlToJson(xml):
response = {}
for child in list(xml):
if len(list(child)) > 0:
response[child.tag] = parseXmlToJson(child)
else:
response[child.tag] = child.text or ''
# one-liner equivalent
# response[child.tag] = parseXmlToJson(child) if len(list(child)) > 0 else child.text or ''
return response