Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
pythonxml.dom.minidom.parse()函数忽略DTD_Python_Xml - Fatal编程技术网

pythonxml.dom.minidom.parse()函数忽略DTD

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: <?

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

我认为您需要从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确实做到了这一点。也更容易阅读。