首页 > 解决方案 > 将 JSON 文件(或 XML,如果更简单的话)转换为 Python 中修改后的 XML 文件

问题描述

我不得不开始一个新问题,因为在上一篇文章中我忘了提到一些重要的事情。我正在尝试在 python 中做到这一点。我尝试打开一个 json 文件,浏览它,修改它,然后以 XML 格式保存修改后的内容。

例子.json

[{"person": "idnum1", "data": "exampledata1"}, {"person": "idnum1", "data": "exampledata2"}, {"person": "idnum2", "data": "exampledata1"}, {"person": "idnum2", "data": "exampledata2"}, {"person": "idnum2", "data": "exampledata3"}]

在我使用 json.load 方法打开 json 文件后,我可以使用“for variable in dictionary”来遍历 json-file 行。我能够将 json 结构转换为 xml 结构并将其保存为 xml 文件。我缺少的是代码的修改部分。

使用该 example.json,我的 pythoncode 将生成一个 xml 文件,如下所示:

<PERSON ID="idnum1">
<data>
    exampledata1
</data></PERSON><PERSON ID="idnum1">
<data>
    exampledata2
</data></PERSON><PERSON ID="idnum2">
<data>
    exampledata1
</data></PERSON><PERSON ID="idnum2">
<data>
    exampledata2
</data></PERSON><PERSON ID="idnum2">
<data>
    exampledata3
</data></PERSON>

但是我应该在python中做什么来修改加载的json,以便我可以将它保存为这样的xml?

<PERSON ID="idnum1">
<data>
    exampledata1 exampledata2
</data></PERSON><PERSON ID="idnum2">
<data>
    exampledata1 exampledata2 exampledata3
</data></PERSON>

所以换句话说,只要人保持不变,引用那个人的数据应该一起收集到xml中一个人元素的一个子元素中,当人在原始json文件中发生变化时,那么应该有该人的 xml 中的另一个元素,它应该包含在一个子元素中引用该人的所有数据。

注意!首先,我也可以从外部系统获取 xml 格式的原始数据,但也应该使用 python 对其进行修改,以便最终结果与我的预期保持一致(将一个人的数据组合成一个人的一个子元素人元素)。目前我可以从 json 文件中获取一个类似的 xml 文件,我可以首先从系统中取出它。

标签: pythonjsonxml

解决方案


使用元素树

import xml.etree.ElementTree as ET
from collections import defaultdict

holder = defaultdict(list)

data = [{"person": "idnum1", "data": "exampledata1"}, {"person": "idnum1", "data": "exampledata2"},
        {"person": "idnum2", "data": "exampledata1"}, {"person": "idnum2", "data": "exampledata2"},
        {"person": "idnum2", "data": "exampledata3"}]


for entry in data:
        holder[entry['person']].append(entry['data'])

top = ET.Element('top')
for k,v in holder.items():
        person = ET.SubElement(top, 'person')
        person.attrib['id'] = k
        text = ' '.join(v)
        data = ET.SubElement(person, 'data')
        data.text = text
print(ET.tostring(top).decode())

输出

<?xml version="1.0" encoding="UTF-8"?>
<top>
   <person id="idnum1">
      <data>exampledata1 exampledata2</data>
   </person>
   <person id="idnum2">
      <data>exampledata1 exampledata2 exampledata3</data>
   </person>
</top>

推荐阅读