lxml 解析时如何去除 <?xml ...> 标签?

2 投票
2 回答
5827 浏览
提问于 2025-04-16 01:11

我现在正在处理解析XML文档的工作,比如添加元素、添加属性等等。所以在开始处理之前,我需要先解析这个XML文件。然而,lxml似乎把元素<?xml ...>给去掉了。例如:

from lxml import etree

tree = etree.fromstring('<?xml version="1.0" encoding="utf-8"?><dmodule>test</dmodule>', etree.XMLParser())
print etree.tostring(tree)

最后的结果是:

<dmodule>test</dmodule>

有没有人知道为什么<?xml ...>这个元素会被去掉呢?我以为编码标签是有效的XML呢。谢谢大家的帮助。

2 个回答

0

有没有人知道为什么要去掉 <?xml ...> 这个元素呢?

XML 默认使用的是 1.0 版本和 UTF-8 编码,所以如果你把它去掉,文档的内容其实是一样的。

你在处理一些 XML 数据,把它转成一个数据结构,然后再把这个数据结构转换回 XML。你得到的 XML 只是这个数据结构的一种表现方式,但可能跟原来的写法不一样(比如可以去掉开头的声明 <?xml ...>,还有 <foo /> 可以换成 <foo></foo>,等等)。

7

<?xml>这个部分是XML的声明,所以它并不算是一个真正的元素。它只是用来提供关于下面的XML结构的一些信息。

如果你想用lxml来打印出来,可以查看这里关于xmlDeclaration=TRUE这个选项的一些信息。

http://lxml.de/api.html#serialisation

etree.tostring(tree, xml_declaration=True)

撰写回答