태그 보관물: json

json

파이썬을 사용하여 XML을 JSON으로 변환 하시겠습니까?

웹에서 부적절한 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