вы пытаетесь изменить этот xml, чтобы диктовать его модулем xmltodict, а затем снова изменить его на xml?
Вот небольшое руководство .
А вот хранилище .
Вот небольшая функция для замены элементов на dict, у нее проблемы, когда два ключа равны, но для замены элементов на ключи, которые не повторяются, все в порядке, по крайней мере, работаетдля меня:
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
Я сделал эту программу и работает перф:
# -*- 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))
С уважением