<p>这就是如何使用lxml实现的;我会尽力解释的</p>
<p>基本原则是,我们随机选择第一个<code>FileName</code>作为目标信息的存储库,将该目标信息粘贴到其中,然后删除该目标的父对象</p>
<pre><code> from lxml import etree
deflines = """<?xml version="1.0" ?>
<DefaultLines>
<Files Date="2020-10-23" Name="D:\report_byfile_detailed.txt">
<FileName file="emem_fifo_1c.vhd ">
<DefLines>
<Message>'120'<Child>Statement</Child>w_addr &lt;= (others =&gt; '0');</Message>
</DefLines>
<DefLines>
<Message>'136'<Child>Statement</Child>r_addr &lt;= (others =&gt; '0');</Message>
</DefLines>
</FileName>
<FileName file="some_other_name.text">
<DefLines>
<Message>'xxxx'<Child>Branch</Child>if (yyyyy= '1000') then</Message>
</DefLines>
</FileName>
<FileName file="emem_fifo_1c.vhd " id="mushi">
<DefLines>
<Message>'119'<Child>Branch</Child>if (SRESET = '1') then</Message>
</DefLines>
</FileName>
</Files>
</DefaultLines>
"""
# I added another FileName which doesn't meet the requirements, just to demonstrate how it works
doc = etree.XML(deflines)
destination = doc.xpath('//Files/FileName[1]//DefLines')[0]
for dl in doc.xpath('//FileName[@file="emem_fifo_1c.vhd "][position()>1]//DefLines'): #position has to be >1 to make sure we skip the destination element
dl.getparent().getparent().remove(dl.getparent()) #the target was inside a parent which to be removed; so we search for the target's grandparent
destination.append(dl)
print(etree.tostring(doc, xml_declaration = True).decode())
</code></pre>