1. ホーム
  2. python

[解決済み] lxml の要素を削除する方法

2023-04-01 08:21:53

質問

pythonのlxmlを使って、属性の内容に基づいて、要素を完全に削除する必要があります。 例

import lxml.etree as et

xml="""
<groceries>
  <fruit state="rotten">apple</fruit>
  <fruit state="fresh">pear</fruit>
  <fruit state="fresh">starfruit</fruit>
  <fruit state="rotten">mango</fruit>
  <fruit state="fresh">peach</fruit>
</groceries>
"""

tree=et.fromstring(xml)

for bad in tree.xpath("//fruit[@state=\'rotten\']"):
  #remove this element from the tree

print et.tostring(tree, pretty_print=True)

これを印刷したい。

<groceries>
  <fruit state="fresh">pear</fruit>
  <fruit state="fresh">starfruit</fruit>
  <fruit state="fresh">peach</fruit>
</groceries>

のように、一時変数を保存して、そこに手動で印刷することなく、これを行う方法はありますか?

newxml="<groceries>\n"
for elt in tree.xpath('//fruit[@state=\'fresh\']'):
  newxml+=et.tostring(elt)

newxml+="</groceries>"

どのように解決するのですか?

この場合 remove メソッドを使用します。

tree=et.fromstring(xml)

for bad in tree.xpath("//fruit[@state=\'rotten\']"):
  bad.getparent().remove(bad)     # here I grab the parent of the element to call the remove directly on it

print et.tostring(tree, pretty_print=True, xml_declaration=True)

Acornバージョンと比較すると、削除する要素がxmlのルートノード直下にない場合でも、私のは動作します。