Python xml.dom.minidom.parse() 函数忽略 DTD

4 投票
5 回答
5199 浏览
提问于 2025-04-11 20:07

我有以下的Python代码:

import xml.dom.minidom
import xml.parsers.expat

try:
    domTree = ml.dom.minidom.parse(myXMLFileName)
except xml.parsers.expat.ExpatError, e:
    return e.args[0]

我用这个代码来解析一个XML文件。虽然它能很轻松地发现一些简单的XML错误,比如标签不匹配,但它完全忽略了XML文件顶部指定的DTD:

<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<!DOCTYPE ServerConfig SYSTEM "ServerConfig.dtd">

所以它没有注意到一些必须的元素缺失,比如说。我该怎么开启DTD检查呢?

5 个回答

2

为了记录一下,我现在的代码是这样的:

from lxml import etree

try:
    parser = etree.XMLParser(dtd_validation=True)
    domTree = etree.parse(myXMLFileName, parser=parser)
except etree.XMLSyntaxError, e:
    return e.args[0]
3

简单来说,Python中的xml.dom.minidom和xml.sax默认使用的是expat解析器,这是一种不进行验证的解析器。它可能会读取DTD(文档类型定义)来进行实体替换,但不会根据DTD进行验证。

gimelTim推荐使用lxml,这是一个很适合Python的库,能够与libxml2和libxslt库配合使用。它支持根据DTD进行验证。我一直在用lxml,觉得它非常好。

5

可以看看这个问题 - 被认可的答案是使用lxml 验证

撰写回答