【问题标题】:Comment out an element using lxml使用 lxml 注释掉一个元素
【发布时间】:2017-06-07 14:53:49
【问题描述】:

是否可以用 python 的 lxml 注释掉一个 xml 元素,同时保留注释中的原始元素呈现?我尝试了以下

elem.getparent().replace(elem, etree.Comment(etree.tostring(elem, pretty_print=True)))

但是tostring() 添加了命名空间声明。

【问题讨论】:

  • 什么命名空间声明?请提供minimal reproducible example
  • mzjn: xmlns="foo" 等。在原始 xml 中,这些声明是从根元素继承的,并且没有显式地存在于子元素中。 tostring() 当然不知道。
  • 好的,我明白了。但我仍然认为请求一个完整的例子来说明问题是合理的。现在我在回答中提供了一个例子。

标签: python lxml


【解决方案1】:

被注释掉的元素的命名空间继承自根元素。演示:

from lxml import etree

XML = """
<root xmlns='foo'>
 <a>
  <b>AAA</b>
 </a>
</root>"""

root = etree.fromstring(XML)
b = root.find(".//{foo}b")
b.getparent().replace(b, etree.Comment(etree.tostring(b)))
print etree.tostring(root)

结果:

<root xmlns="foo">
 <a>
  <!--<b xmlns="foo">AAA</b>
 --></a>
</root>

操作命名空间通常比您想象的要难。见https://stackoverflow.com/a/31870245/407651

我的建议是使用BeautifulSoup,实际上它并不真正关心命名空间(soup.find('b') 返回 b 元素,即使它位于 foo 命名空间中)。

from bs4 import BeautifulSoup, Comment

soup = BeautifulSoup(XML, "xml")
b = soup.find('b')
b.replace_with(Comment(str(b)))
print soup.prettify()

结果:

<?xml version="1.0" encoding="utf-8"?>
<root mlns="foo">
 <a>
  <!--<b>AAA</b>-->
 </a>
</root>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-02
    • 2014-05-01
    • 2017-08-05
    • 2022-01-07
    • 1970-01-01
    • 2010-11-01
    • 2014-01-08
    • 2020-07-19
    相关资源
    最近更新 更多