【问题标题】:JSON to XML File using Python使用 Python 将 JSON 转为 XML 文件
【发布时间】:2020-04-15 11:37:39
【问题描述】:

我正在尝试将一个大的JSON 文件转换为XML 文件。下面是我从一个大的 JSON 中取出的两行。我正在尝试为此文件中存在的每个 INVENTORY_SEQ_ID 创建一个根节点:

[{"INVENTORY_SEQ_ID":4577494,"GROUP_NBR":8605548,"SEQ_NBR":300,"FACILITY_CODE":"OCALADC","COMPANY_CODE":"AMES"},
{"INVENTORY_SEQ_ID":4577495,"GROUP_NBR":8605548,"SEQ_NBR":301,"FACILITY_CODE":"OCALADC","COMPANY_CODE":"AMES"}]

我写了下面的代码(我只是这个领域的初学者),如果 JSON 文件中只有一行,它就可以工作。如果有超过一个,它会抛出一个错误。

import json as j
with open("invdata.json") as input_var:
 d=j.load(input_var)
import xml.etree.cElementTree as e
r=e.Element("InvHead")
e.SubElement(r,"INVENTORY_SEQ_ID").text = str(d["INVENTORY_SEQ_ID"])
e.SubElement(r,"GROUP_NBR").text = str(d["GROUP_NBR"])
e.SubElement(r,"SEQ_NBR").text = str(d["SEQ_NBR"])
e.SubElement(r,"FACILITY_CODE").text = d["FACILITY_CODE"]
e.SubElement(r,"COMPANY_CODE").text = d["COMPANY_CODE"]
a=e.ElementTree(r)
a.write("output.xml")

非常感谢任何帮助。

谢谢 安摩尔

【问题讨论】:

标签: python json xml


【解决方案1】:

当只有一个对象时,json.load 将返回一个字典,而对于多个条目,它返回一个字典列表。因此,如果您将 d["INVENTORY_SEQ_ID"] 替换为 d[i]["INVENTORY_SEQ_ID"],您可以使您的代码正常工作,其中 i 会遍历您的所有对象。

您可以尝试这种更简单的方法

from json import load,loads
from dicttoxml import dicttoxml

with open("invdata.json") as input_var:
 d=load(input_var)
di = {"InvHead":d}
xm = dicttoxml(di)     #returns xm as <class 'bytes'> object

with open("output.xml", mode='wb') as out:  #opening in write-bytes mode 
    out.write(xm)

输出的 XML 是 output.xml

让我知道这是否适用于您的情况。
建议零售价

【讨论】:

    【解决方案2】:
    from json import load
    from dicttoxml import dicttoxml
    ...
    xml = dicttoxml(load(input_var))
    

    然后将 xml 保存到文件中

    【讨论】:

      【解决方案3】:

      这是我的尝试:我需要 dict Keys 成为标签名称。

      def to_xml(values):
          result = ""
          # this works only for text and int values.
          # implement your own case for other types.
          if isinstance(values, str) or  isinstance(values, int):
              return values
          elif isinstance(values, dict):
              for key in values:
                  result += "<" + key + ">" + str(to_xml(values[key])) + "</" + key + ">"
              return result
      

      输出:

      >>> mydict = {"test":{"foo":"bar","number":1}}
      >>> to_xml(mydict)
      '<test><foo>bar</foo><number>1</number></test>'
      

      如果你需要它作为 xml 对象你可以再次解析它:

      >>> from xml.dom import minidom
      >>> minidom.parseString(to_xml(mydict))
      <xml.dom.minidom.Document object at 0x7fdc3e9d1be0>
      

      【讨论】:

        【解决方案4】:

        我发现xmltodict 对这项任务很有用。见https://pypi.org/project/xmltodict/

        import xmltodict
        import json
        sample_json = {
            "document":{
            "firstName": "Jane",
            "lastName": "Doe",
            "hobbies": ["running", "sky diving", "singing"],
            "age": 35,
            "children": [
                {
                    "firstName": "Alice",
                    "age": 6
                },
                {
                    "firstName": "Bob",
                    "age": 8
                }
            ]}
        
        }
        #############
        #json to xml
        #############
        json_to_xml = xmltodict.unparse(sample_json)
        print(json_to_xml)
        #############
        #xmlto json
        #############
        x_to_j_dict = xmltodict.parse(json_to_xml)
        x_to_j_string = json.dumps(x_to_j_dict)
        back_to_json = json.loads(x_to_j_string)
        print(back_to_json)
        

        【讨论】:

          猜你喜欢
          • 2011-09-21
          • 1970-01-01
          • 1970-01-01
          • 2010-09-16
          • 2020-09-21
          • 2021-01-08
          • 2015-02-23
          • 1970-01-01
          • 2019-11-17
          相关资源
          最近更新 更多