我需要在保留其數據的同時刪除 XML 元素。lxml 函數strip_tags確實刪除了元素,但它以遞歸方式工作,我想去除單個元素。我嘗試使用這篇文章的答案,但remove刪除了整個元素。xml="""<groceries> One <fruit state="rotten">apple</fruit> a day keeps the doctor away. This <fruit state="fresh">pear</fruit> is fresh.</groceries>"""tree=ET.fromstring(xml)for bad in tree.xpath("//fruit[@state='rotten']"): bad.getparent().remove(bad)print (ET.tostring(tree, pretty_print=True))我想得到<groceries> One apple a day keeps the doctor away. This <fruit state="fresh">pear</fruit> is fresh.</groceries>\n'我明白了<groceries> This <fruit state="fresh">pear</fruit> is fresh.</groceries>\n'我嘗試使用strip_tags:for bad in tree.xpath("//fruit[@state='rotten']"): ET.strip_tags(bad.getparent(), bad.tag)<groceries> One apple a day keeps the doctor away. This pear is fresh.</groceries>但這會剝離一切,我只想用state='rotten'.
1 回答

ibeautiful
TA貢獻1993條經驗 獲得超6個贊
也許其他人有更好的主意,但這是一種可能的解決方法:
bad = tree.xpath(".//fruit[@state='rotten']")[0] #for simplicity, I didn't bother with a for loop in this case
txt = bad.text+bad.tail # collect the text content of bad; strangely enough it's not just 'apple'
bad.getparent().text += txt # add the collected text to the parent's existing text
tree.remove(bad) # this gets rid only of this specific 'bad'
print(etree.tostring(tree).decode())
輸出:
<groceries>
One apple a day keeps the doctor away.
This <fruit state="fresh">pear</fruit> is fresh.
</groceries>
添加回答
舉報
0/150
提交
取消