如何防止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)
当我输入以下内容时:
<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 中似乎仍然有效)