【问题标题】:Converting JSON file with multiple entries to XML将具有多个条目的 JSON 文件转换为 XML
【发布时间】:2021-07-05 07:20:06
【问题描述】:

我的输入 json 文件看起来像这样

{"id":1,"author":"abc","title":"xyz"}
{"id":2,"author":"def","title":"mno"}

我想要一个 python 脚本来创建一个看起来像这样的 xml 文件

<sequence>
<id>1</id>
<author>abc</author>
<title>xyz</title>
</sequence>
<sequence>
<id>2</id>
<author>def</author>
<title>mno</title>
</sequence>

现在这是我正在使用的代码

import json as j
with open("test.json") as json_format_file: 
  d = j.load(json_format_file)
import xml.etree.cElementTree as e
r = e.Element("sequence")
e.SubElement(r,"id").text = d["id"]
e.SubElement(r,"submitter").text = d["submitter"]
e.SubElement(r,"authors").text = str(d["authors"])
e.SubElement(r,"title").text = str(d["title"])

a = e.ElementTree(r)
a.write("json_to_xml.xml")

问题是它只适用于 1 个条目,如果我在 JSON 文件中有超过 1 个条目,它会引发错误。我怎样才能让这个运行多个条目并将其全部写入 xml 文件?

编辑: 已将我的 JSON 文件更改为如下所示

[{"id":1,"author":"abc","title":"xyz"},
{"id":2,"author":"def","title":"mno"}]

【问题讨论】:

  • 您的输入文件是无效的 JSON。一个有效的 json 文件看起来像 [{"id":1,"author":"abc","title":"xyz"}, {"id":2,"author":"def","title":"mno"}]
  • 啊,好吧,如果我将我的 JSON 文件更改为这样,它会起作用吗?
  • 至少你可以使用for inner_dict in d: ... 并使用inner_dict["id"] 等。
  • 嗯,好的,我去看看。太棒了!

标签: python arrays json xml


【解决方案1】:

json2xml 是强大的python 库之一。试试这个。

json.json

[{"id":1,"author":"abc","title":"xyz"}, {"id":2,"author":"def","title":"mno"}]

Python

from json2xml import json2xml
import lxml.etree as ET
import json

with open('json.json') as data_file:
    data = json.load(data_file)


json2xml = json2xml.Json2xml(data, wrapper="sequence", pretty=True, attr_type=False).to_xml()
with open('json2xml.xml', 'w') as f:
    f.write(json2xml)
    
    
## modifie xml data
tree = ET.parse('json2xml.xml')
root = tree.getroot()
for item in root.findall('item'):
    for child in item:
        root.append(child)
    root.remove(item)


new_xml = ET.tostring(root, pretty_print=True, xml_declaration=True, encoding="UTF-8")
with open('file.xml', 'wb' ) as final:
    final.write(new_xml)

【讨论】:

  • @chinnasddf 我希望你得到你想要的。
  • 我在这些 cmets 中格式化它有点麻烦,但我想我可以做到。谢谢
【解决方案2】:

可以修改json数据,做成数组吗?

{
    "updated": "2020-07-09",
    "list": [
         {"id":1,"author":"abc","title":"xyz"},
         {"id":2,"author":"def","title":"mno"}
    ]
}

import json as j
with open('data.json') as data_file:    
data = json.load(data_file)
for obj in data['list']:

r = e.Element("sequence")

e.SubElement(r,"id").text = obj["list"]["id"]
e.SubElement(r,"submitter").text = obj["list"]["submitter"]
e.SubElement(r,"authors").text = str(obj["list"]["authors"])
e.SubElement(r,"title").text = str(obj["list"]["title"])   

a = e.ElementTree(r)

a.write("json_to_xml.xml")

【讨论】:

  • 如果我们已经在做'for obj in data['list'],我们是否需要再次使用obj['list']['id'] 或者将obj['id '] 工作?因为我现在尝试了这个并且我在 obj['list'] 的行中得到了一个 KeyError:'list'
  • 哦,我修改了json格式,见列表数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-14
  • 2016-07-03
  • 1970-01-01
  • 2020-09-21
  • 2017-06-18
相关资源
最近更新 更多