pythonxml.dom.minidom.parse()函数忽略DTD
我有以下Python代码:pythonxml.dom.minidom.parse()函数忽略DTD,python,xml,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: <?
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检查?我认为您需要从expat切换到xmlproc。
见:
请参阅-公认的答案是使用。我建议使用lxml而不是xmlproc,因为不再开发PyXML包(包含xmlproc);PyXML可以与之一起使用的最新Python版本是2.4。仅作为解释:Python xml.dom.minidom和xml.sax默认使用expat解析器,这是一个非验证解析器。它可以读取DTD以进行实体替换,但不会针对DTD进行验证
并推荐lxml,它是libxml2和libxslt库的一种很好的pythonic绑定。它支持对DTD进行验证。我一直在使用lxml,我非常喜欢它。为了记录在案,我现在的代码是这样的:
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]
谢谢我希望避免在标准库之外工作,但lxml确实做到了这一点。也更容易阅读。