例如:
<site>
<tools>
<name>jalen.site</name>
</tools>
<tools>
<server>aliyun</server>
</tools>
</site>
合併爲:
<site>
<tools>
<name>jalen.site</name>
<server>aliyun</server>
</tools>
</site>
代碼:
from xml.etree import ElementTree
from xml.etree.ElementTree import SubElement
from collections import Counter
def test_et(xml_str):
root = ElementTree.fromstring(xml_str)
parent_map = dict((c, p) for p in root.getiterator() for c in p)
nodes = [(node.tag, parent_map[node]) for node in root.iter() if node is not root]
counter = dict(Counter(nodes))
duplicates = [key for key, value in counter.items()if value > 1]
if not duplicates:
return ElementTree.tostring(root)
for node in duplicates:
elements = [neighbor for neighbor in root.iter(node[0])]
elements = [element for element in elements if parent_map[element] == node[1]]
new = SubElement(node[1], node[0])
for ele in elements:
old = [elem for elem in ele.iter() if elem is not ele]
node[1].remove(ele)
new.extend(old)
return ElementTree.tostring(root)
if __name__ == '__main__':
xml_str = "<site>" \
" <tools>" \
" <name>jalen.site</name>" \
" </tools>" \
" <tools>" \
" <server>aliyun</server>" \
" </tools>" \
"</site>"
res = test_et(xml_str)
print(res)
xml_str = "<site>" \
" <tools>" \
" <name>jalen.site</name>" \
" </tools>" \
" <tools>" \
" <server>aliyun1</server>" \
" </tools>" \
" <tools>" \
" <server>aliyun2</server>" \
" </tools>" \
" <tools>" \
" <server>aliyun3</server>" \
" </tools>" \
"</site>"
res = test_et(xml_str)
print(res)
xml_str = "<site>" \
" <tools>" \
" <name>jalen.site</name>" \
" </tools>" \
" <tools>" \
" <server>aliyun1</server>" \
" </tools>" \
" <operate>" \
" <server>aliyun2</server>" \
" </operate>" \
" <operate>" \
" <server>aliyun3</server>" \
" </operate>" \
"</site>"
res = test_et(xml_str)
print(res)
xml_str = "<site>" \
" <tools>" \
" <name>jalen.site</name>" \
" </tools>" \
" <tools>" \
" <server>aliyun1</server>" \
" </tools>" \
" <operate>" \
" <test><name>kite.site</name></test>" \
" <test><server>aliyun2</server></test>" \
" </operate>" \
"</site>"
res = test_et(xml_str)
print(res)
參考:
https://docs.python.org/2/library/xml.etree.elementtree.html