如何防止xml.ElementTree fromstring删除commentnode

mar*_*ema 10 python xml elementtree

我有以下代码片段:

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

当我输入以下内容时input:

<math>
  <a> 1 2 3 </a>  <b />
<foo>Uitleg</foo>
<!-- <bar> -->
</math>
Run Code Online (Sandbox Code Playgroud)

它导致:

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

</m:math>
Run Code Online (Sandbox Code Playgroud)

怎么会?我该如何保留评论?

编辑:我不关心使用的确切xml库,但是,我应该能够对标记进行粘贴更改.不幸的是,lxml似乎不允许这样(我不能使用正确的命名空间操作)

Ste*_*ven 14

你不能用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)
Run Code Online (Sandbox Code Playgroud)

到目前为止这是最简单的选择.如果你真的必须使用xml.etree,你可以尝试连接你自己的解析器,尽管那时,评论还没有得到官方的支持:看一下这个例子(来自xml.etree的作者)(似乎仍然可以工作) python 2.7顺便说一下)