如何防止xml.ElementTree从字符串中丢失注释节点

14 投票
1 回答
7612 浏览
提问于 2025-04-16 14:16

我有以下这段代码:

    from xml.etree.ElementTree import fromstring,tostring
    mathml = fromstring(input)
    for elem in mathml.getiterator():
        elem.tag = 'm:' + elem.tag
    return tostring(mathml)

当我输入以下内容时:

<math>
  <a> 1 2 3 </a>  <b />
<foo>Uitleg</foo>
<!-- <bar> -->
</math>

结果是:

<m:math>
  <m:a> 1 2 3 </m:a>  <m:b />
<m:foo>Uitleg</m:foo>

</m:math>

这是怎么回事呢?我该如何保留这个注释?

补充说明:我不在乎具体使用哪个xml库,不过我应该能对标签进行粘贴的修改。不幸的是,lxml似乎不允许这样做(而且我不能使用正确的命名空间操作)。

1 个回答

17

你不能使用 xml.etree,因为它的解析器会忽略注释(这其实是 XML 解析器的正常行为)。不过,如果你使用兼容的 lxml 库,就可以配置 解析器选项,这样就能处理注释了。

from lxml import etree

parser = etree.XMLParser(remove_comments=False)
tree = etree.parse('input.xml', parser=parser)
# or alternatively set the parser as default:
# etree.set_default_parser(parser)

这绝对是最简单的选择。如果你真的必须使用 xml.etree,你可以尝试自己连接一个解析器,尽管即便如此,注释也不是官方支持的:可以看看 这个例子(来自 xml.etree 的作者)(顺便说一下,这个在 Python 2.7 中似乎仍然有效)

撰写回答