我有以下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检查?
答案 0 :(得分:4)
请参阅this question - 接受的答案是使用lxml validation。
答案 1 :(得分:3)
仅作为解释:Python xml.dom.minidom和xml.sax默认使用expat解析器,这是一个非验证解析器。它可以读取DTD以进行实体替换,但不会对DTD进行验证。
gimel和Tim推荐使用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/