<p>您是否尝试使用模块xmltodict将该xml更改为dict,然后再次将其更改为xml?你知道吗</p>
<p><a href="https://docs.python-guide.org/scenarios/xml/" rel="nofollow noreferrer">Here is a little guide</a>。你知道吗</p>
<p><a href="https://github.com/martinblech/xmltodict" rel="nofollow noreferrer">And here the repository</a>。你知道吗</p>
<p>这里有一个小函数来替换dict上的元素,当两个键相等时它会有问题,但是对于用不重复的键替换元素,它是可以的,至少对我来说是有效的:</p>
<pre><code>def changes_dict(self, tree, change):
"""Function that changes the values of a json with the keys given
:param tree: Json to be changed
:param change: Dictionary with the keys to be changed and the new values: {field1: value1, field2: value2,..., fieldN: valueN}"""
if isinstance(tree,(list,tuple)):
res = []
for subItem in tree:
result = self.changes_dict(subItem, change)
res.append(result)
return res
elif isinstance(tree,dict):
for nodeName in tree.keys():
subTree = tree[nodeName]
if nodeName in list(change.keys()):
tree[nodeName] = {'value': str(change[nodeName])}
change.pop(nodeName)
if not change:
break
else:
tree[nodeName] = self.changes_dict(subTree, change)
return tree
elif isinstance(tree, str):
return tree
</code></pre>
<p>我制作了这个程序并完成了以下工作:</p>
<pre><code># -*- coding: utf-8 -*-
import xmltodict, json
def changes_dict(tree, change, wordHelp):
"""Function that changes the values of a json with the keys given
:param tree: Json to be changed
:param change: Dictionary with the keys to be changed and the new values: {field1: value1, field2: value2,..., fieldN: valueN}
:param wordHelp: Word that must be in the values of the dict that contains the change"""
if isinstance(tree,(list,tuple)):
res = []
for subItem in tree:
result = changes_dict(subItem, change, wordHelp)
res.append(result)
return res
elif isinstance(tree,dict):
for nodeName in tree.keys():
subTree = tree[nodeName]
if nodeName in list(change.keys()) and wordHelp in list(tree.values()):
tree[nodeName] = {'value': str(change[nodeName])}
change.pop(nodeName)
if not change:
break
else:
tree[nodeName] = changes_dict(subTree, change, wordHelp)
return tree
elif isinstance(tree, str):
return tree
x = """
<proj>
<mV>4.0.0</mV>
<gId>com.test</gId>
<aId>console</aId>
<vn>1.0</vn>
<bld>
<plugins>
<plugin>
<gId>org.apache.maven.plugins</gId>
<aId>maven-compiler-plugin</aId>
<vn>1.1</vn>
<configuration>
<source>1.0</source>
<target>1.0</target>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
</plugins>
</bld>
<dp>
<gId>org.sk</gId>
<aId>sk-api</aId>
<vn>1.7.20</vn>
</dp>
<dp>
<gId>org.sk</gId>
<aId>sk-log</aId>
<vn>1.7.25</vn>
</dp>
</dps>
</proj> """
dicti = eval(json.dumps(xmltodict.parse(x)))
dicti_changed = changes_dict(dicti, {'vn': 'somevalue'}, 'sk-log')
print(xmltodict.unparse(dicti_changed))
</code></pre>
<p>敬礼</p>