Python lxml : Ignore XML declaration (errors)

标签 python xml lxml thunar

我正在尝试使用 lxml Python 模块解析文件浏览器 Thunar 的自定义操作文件 (~/.config/Thunar/uca.xml)。

出于某种原因,Thunar 显然在这些文件中写入了格式错误的声明:

<?xml encoding="UTF-8" version="1.0"?>

显然,版本应该作为声明中的第一个“属性”出现。如果我尝试解析该文件,lxml 会引发 XMLSyntaxError

不,我不能简单地更正该声明,因为 Thunar 不断用伪造的声明覆盖它。

这很可能是 Thunar 中的一个错误。

尽管如此,我想知道如何使用 lxml 忽略 XML 声明。

我知道我可以预处理 XML 文档以过滤掉 XML 声明。但这看起来不太优雅。由于 XML 似乎默认为版本 1.0 和 UTF-8 编码,因此肯定有可能忽略该声明并假设在 lxml 中。我在文档或谷歌上没有找到任何内容,我可能忽略了一些东西。

最佳答案

我对 Thunar 知之甚少,但如果它在问题中生成 XML 声明,那么那就是一个错误。不正确的 XML 声明会导致文档格式错误。

XML 语法为 XML 声明中的项目指定了一种正确的顺序。 version 必须排在第一位,encoding 其次。请参阅http://w3.org/TR/xml/#NT-XMLDecl

但是,通过 lxml,您可以使用将 recover 选项设置为 True 的解析器实例进行解析。在这种情况下它有效。错误的 XML 声明将被忽略。

from lxml import etree 

parser = etree.XMLParser(recover=True)
tree = etree.parse('uca.xml', parser)

参见http://lxml.de/api/lxml.etree.XMLParser-class.html

关于Python lxml : Ignore XML declaration (errors),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44352989/

相关文章:

python - 无法使用 lxml Xpath 解析器解析 html

python - 无法使用 python 打印列中的目录列表

python - cProfile 和 Python : Finding the specific line number that code spends most time on

python - lxml 解析没有 Schema URL 的 xsd 文件

sql-server - 在 SQL Server 中使用 OPENXML 解析具有内联架构的 XML 文件

具有嵌套元素的 Python LXML 迭代解析

python - 如何将字符串的每个字符转换为 ASCII 并填充到给定长度

python - 朴素贝叶斯多项式模型

xml - 如何使用 PowerShell 根据 XSD 验证 XML 文件?

python - 如何在 Python 3 中将 SubElement 的内容包装在 XML 标记中?