您可以检查存储库标签是否在元数据标签列表内,如果没有则创建 SubElement()。并且不要忘记注册您的名称空间:
import xml.etree.ElementTree as ET
tree = ET.parse("abc.nuspec")
root = tree.getroot()
namespaces = {node[0]: node[1] for event, node in ET.iterparse("abc.nuspec", events=['start-ns'])}
print("My Namespaces:", namespaces,'\n')
for ns in namespaces:
ET.register_namespace(ns, namespaces[ns])
for meta in root.findall("metadata", namespaces):
if meta.findall("repository", namespaces):
pass
else:
rep = ET.SubElement(meta, "repository")
rep.set("url", "https://github.com/test/test-repo")
rep.set("type", "get" )
ET.dump(root)
tree1 = ET.ElementTree(root)
ET.indent(tree1, space= ' ')
tree1.write('abc_new.nuspec', encoding="utf-8", xml_declaration=True)
谢谢,这对我有用,这里,如果meta.findall("repository", namespaces)返回true,并且如果已经有任何值,如何修改url的值?说测试-repo-1? .
一种有效的方法是删除存储库元素并创建新元素。
if meta.findall("repository", namespaces):
for ele in meta.iter():
if ele.tag.endswith("repository"):
meta.remove(ele)
rep = ET.SubElement(meta, "repository")
rep.set("url", "https://github.com/incontact/test-repo-1")
rep.set("type", "nuget")
else:
rep = ET.SubElement(meta, "repository")
rep.set("url", "https://github.com/incontact/test-repo-1")
rep.set("type", "nuget")
还有更好的方法吗?