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

时间:2008-11-18 13:56:04

标签: python xml

我有以下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 个答案:

答案 0 :(得分:4)

请参阅this question - 接受的答案是使用lxml validation

答案 1 :(得分:3)

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

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

答案 2 :(得分: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 :(得分:1)

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

答案 4 :(得分:0)

我相信你需要从expat切换到xmlproc 看到: http://code.activestate.com/recipes/220472/