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

Python xml.dom.minidom.parse() function ignores DTDs

提问人:Charles Anderson 提问时间:11/18/2008 更新时间:11/19/2008 访问量:5184

问:

我有以下 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 检查?

XML 格式

评论


答:

0赞 acrosman 11/18/2008 #1

我相信您需要从 expat 切换到 xmlproc。
请参见:http://code.activestate.com/recipes/220472/

5赞 gimel 11/18/2008 #2

请参阅此问题 - 公认的答案是使用 lxml 验证

评论

0赞 Charles Anderson 11/18/2008
谢谢。我希望避免在标准库之外工作,但 lxml 确实可以解决问题。也更容易阅读。
1赞 Tim Pietzcker 11/18/2008 #3

我推荐 lxml 而不是 xmlproc,因为不再开发 PyXML 包(包含 xmlproc);PyXML 可以使用的最新 Python 版本是 2.4。

3赞 ChuckB 11/18/2008 #4

简单解释一下:Python xml.dom.minidom 和 xml.sax 默认使用 expat 解析器,这是一个非验证解析器。它可能会读取 DTD 以执行实体替换,但不会针对 DTD 进行验证。

gimelTim 推荐 lxml,它是 libxml2 和 libxslt 库的一个很好的 pythonic 绑定。它支持针对 DTD 进行验证。我一直在使用 lxml,我非常喜欢它。

2赞 Charles Anderson 11/19/2008 #5

只是为了记录,这是我的代码现在的样子:

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]