2008-11-18 143 views
3

我有以下Python代码:Python的xml.dom.minidom.parse()函数忽略的DTD

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检查?

回答

4

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

+0

感谢。我希望避免必须在标准库之外工作,但lxml肯定会做到这一点。也更容易阅读。 – 2008-11-18 15:50:29

1

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

3

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

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

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]