13

我有以下代码片段:

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

当我输入以下内容时input

<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 似乎不允许这样做(而且我不能使用正确的命名空间操作)

4

1 回答 1

16

你不能 with 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)

于 2011-03-23T21:19:30.143 回答