python - 如何使用 lxml 删除标题/尾随处理指令
问题描述
如何删除作为 XML 树中根元素的兄弟的处理指令?
我找不到任何功能可以做到这一点,并且经典方式不起作用,因为头/尾处理指令没有父级:
from lxml import etree
root = etree.XML("<ROOT/><?foo?>")
tail = root.getnext()
parent = tail.getparent() # parent is None
parent.remove(tail)
我得到:
Traceback (most recent call last):
File "/path/to/demo_remove_tail_pi.py", line 6, in <module>
parent.remove(tail)
AttributeError: 'NoneType' object has no attribute 'remove'
解决方案
这是因为处理指令是在根 XML 树之外生成的。许多年前,这在 LXML 的网站上作为一个错误被提出,但不幸的是,它看起来似乎从未实施过适当的修复。
线程上的一个用户提供了一种(hackyish)方法来删除以这种方式生成的处理指令。只需获取标签,将其附加到根元素,然后将其删除。
与其他一些 XML 库不同,lxml 允许一个元素出现在一个地方。也就是说,你不能将一个元素复制到另一个地方;尝试将其移动到新位置,将其从旧位置移除。
from lxml.etree import XML, tounicode
root = XML("<ROOT/><?foo?>")
print(tounicode(root.getroottree()))
>>> <ROOT/><?foo?>
tail = root.getnext()
root.append(tail)
root.remove(tail)
print(tounicode(root.getroottree()))
>>> <ROOT/>
推荐阅读
- javascript - 如何检查嵌套在 tampermonkey 的 iframe?
- ruby-on-rails - 禁用 Rails/SkipsModelValidations 的 Rubocop 命令:避免使用 update_all 错误
- bash - 如何绑定上一个和下一个历史键来控制 bash 中的 j 和 k?
- c - 在 C 中限制字符串长度的问题
- git - 如何存储自定义消息
- python - 使用'登录python字符串
- html - 缓存的视频无法在网站上加载
- typo3 - gridelement:打开新内容元素向导时冻结后端
- driver - 链接器错误“未解析的外部符号 __stdio_common_vsprintf”,构建 Windows 内核驱动程序
- android - Koin 注入到 viewModels android