首页 > 解决方案 > 删除多个同名节点

问题描述

假设我有一个 XML 树,如下所示:

my_data.xml
<?xml version="1.0" encoding="UTF-8"?>
<data>    
  <country name="Singapore" xmlns="aaa:bbb:ccc:singapore:eee">
    <continent>Asia</continent>
    <rank updated="yes">5</rank>
    <year>2011</year>
    <gdppc>59900</gdppc>
    <neighbor name="Malaysia" direction="N"/>
  </country>
  <country name="Panama" xmlns="aaa:bbb:ccc:panama:eee">
    <rank updated="yes">69</rank>
    <year>2011</year>
    <gdppc>13600</gdppc>
    <neighbor name="Costa Rica" direction="W"/>
    <neighbor name="Colombia" direction="E"/>
  </country>
  <ethnicity xmlns="aaa:bbb:ccc:ethnicity:eee">
    <maylay>
      <holidays>ramadan</holidays>
      <holidays>eid al fitri</holidays>
    </malay>
  </ethnicity>
</data>

解析树lxml

import lxml.etree as etree

xtree = etree.parse('my_data.xml')
xroot = xtree.getroot()
malay_node = xroot.xpath('.//*[local-name()="malay"]')[0]
malay_holiday_nodes = xroot.xpath('.//*[local-name()="holidays"]')

我想同时删除holidaysnode 下的所有节点malay。请注意,这malay_holiday_nodes是一个list. 如果我这样做:

malay_node.remove(malay_holiday_nodes)

我收到此错误:

TypeError: Argument 'element' has incorrect type (expected lxml.etree._Element, got list)

for有什么简单的方法可以在没有循环的情况下删除整个子节点列表吗?谢谢。

标签: pythonlxml

解决方案


使用 XSLT(我是它的忠实粉丝和用户)的替代方法是使用 lxml 的strip_elements()...

from lxml import etree

tree = etree.parse("my_data.xml")

etree.strip_elements(tree, "{*}holidays", with_tail=True)

tree.write("output.xml")

使用您的示例 XML 输出(“output.xml”),并修复了 maylay/malay 标签不匹配...

<data>
  <country xmlns="aaa:bbb:ccc:singapore:eee" name="Singapore">
    <continent>Asia</continent>
    <rank updated="yes">5</rank>
    <year>2011</year>
    <gdppc>59900</gdppc>
    <neighbor name="Malaysia" direction="N"/>
  </country>
  <country xmlns="aaa:bbb:ccc:panama:eee" name="Panama">
    <rank updated="yes">69</rank>
    <year>2011</year>
    <gdppc>13600</gdppc>
    <neighbor name="Costa Rica" direction="W"/>
    <neighbor name="Colombia" direction="E"/>
  </country>
  <ethnicity xmlns="aaa:bbb:ccc:ethnicity:eee">
    <malay>
      </malay>
  </ethnicity>
</data>

推荐阅读