python - 将 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 文件,我可以首先从系统中取出它。
解决方案
使用元素树
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>
推荐阅读
- react-native - 哪种存储加载过程的方法更可取?
- ssl - 如何以命令方式分别从 PEM 文件中获取证书部分和私钥部分?
- python - 如何有条件地跨两列合并
- java - 从数据库中计算产品时,Firebase 变慢(Android)
- sonarqube - 将多个 gcov 文件合并为一个
- r - 尝试在 R 中建模决策树会导致问题
- c# - indexof 返回 -1
- gcloud - 创建新的云作曲家 env 时,是否可以将存储桶设置为预先存在的存储桶?
- validation - 验证 npm package.json
- c# - WPF - 如何从 Pack URI 获取控件的代码隐藏类型定义?