python - 删除多个同名节点
问题描述
假设我有一个 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"]')
我想同时删除holidays
node 下的所有节点malay
。请注意,这malay_holiday_nodes
是一个list
. 如果我这样做:
malay_node.remove(malay_holiday_nodes)
我收到此错误:
TypeError: Argument 'element' has incorrect type (expected lxml.etree._Element, got list)
for
有什么简单的方法可以在没有循环的情况下删除整个子节点列表吗?谢谢。
解决方案
使用 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>
推荐阅读
- git - ChefSpec 找不到安装的 git
- python - 我什么时候应该在 pandas 数据帧上使用 query vs eval?
- c - 将 printf 命令写入或保存到文本文件(c 编程)
- node.js - 同一行 Node.js 代码可以同时运行吗?
- java - java - 如何在java中使用useDelmeter从字符串中获取两个特定值?
- spring-boot-actuator - 如何自定义 Spring Boot admin 2.o UI?
- c - 从 16 位架构中的给定索引计算位掩码
- r - 有条件的按组计数(在 R data.table 中)
- angular - 活动路由解析器在每次调用时返回未定义
- vba - VBA/Word:将表单名称作为参数传递有效但会导致错误