Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.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
使用Python和lxml根据外部DTD验证XML_Python_Xml_Validation_Lxml_Dtd - Fatal编程技术网

使用Python和lxml根据外部DTD验证XML

使用Python和lxml根据外部DTD验证XML,python,xml,validation,lxml,dtd,Python,Xml,Validation,Lxml,Dtd,我试图根据doctype标记中引用的外部DTD验证XML文件。具体而言: …文档的其余部分。。。 我正在使用Python3.3和lxml模块。通过阅读,我总结了以下内容: enexFile=open(sys.argv[2],mode=“rb”)#sys.argv[2]是本地存储中XML文件的路径。 enexParser=etree.XMLParser(dtd_validation=True) enexTree=etree.parse(enexFile,enexParser) 根据我对val

我试图根据doctype标记中引用的外部DTD验证XML文件。具体而言:


…文档的其余部分。。。
我正在使用Python3.3和lxml模块。通过阅读,我总结了以下内容:

enexFile=open(sys.argv[2],mode=“rb”)#sys.argv[2]是本地存储中XML文件的路径。
enexParser=etree.XMLParser(dtd_validation=True)
enexTree=etree.parse(enexFile,enexParser)
根据我对validation.html的理解,lxml库现在应该负责检索DTD并执行验证。但我得到的却是:

$。/maprangler.py validate notes.enex
回溯(最近一次呼叫最后一次):
文件“/maprangler.py”,第27行,在
enexTree=etree.parse(enexFile,enexParser)
lxml.etree.parse(src/lxml/lxml.etree.c:69955)中的文件“lxml.etree.pyx”,第3239行
文件“parser.pxi”,第1769行,在lxml.etree.\u parseDocument(src/lxml/lxml.etree.c:102257)中
文件“parser.pxi”,第1789行,在lxml.etree.\u parseFilelikeDocument(src/lxml/lxml.etree.c:102516)中
文件“parser.pxi”,第1684行,在lxml.etree.\u parseDocFromFilelike(src/lxml/lxml.etree.c:101442)中
lxml.etree.\u BaseParser.\u parseDocFromFilelike(src/lxml/lxml.etree.c:97069)中的文件“parser.pxi”,第1134行
文件“parser.pxi”,第582行,在lxml.etree.\u ParserContext.\u handleParseResultDoc(src/lxml/lxml.etree.c:91275)中
文件“parser.pxi”,第683行,在lxml.etree.\u handleParseResult(src/lxml/lxml.etree.c:92461)中
lxml.etree中的文件“parser.pxi”,第622行。\u raiseParserError(src/lxml/lxml.etree.c:91757)
lxml.etree.xmlsyntaxer错误:验证失败:未找到DTD!,第3行第43栏
这让我感到惊讶,因为如果我关闭验证,那么文档的解析就会很好,我可以执行
print(enexTree.docinfo.doctype)
来获取

$。/maprangler.py validate notes.enex
所以在我看来,找到DTD应该不会有任何问题


感谢您的帮助。

在构造解析器对象时,您需要添加
no\u network=False
。默认情况下,此选项设置为
True

来自以下位置的解析器选项文档:

无网络-在查找外部文档时阻止网络访问(默认情况下打开)


出于一个我仍然不知道的原因,我的问题与XML目录在本地文件系统中的位置有关

在我的例子中,我使用了一个与组件内容管理系统(CCMS,在本例中是SDL Trisoft 2011 R2)紧密集成的XML编辑器。当编辑器连接到CCMS时,将同步DTD、目录文件和一组其他文件。这些文件最终位于本地文件系统中:

C:\Users\[username]\AppData\Local\Trisoft\InfoShare Client\[id]\Config\DocTypes\catalog.xml
我不能让它工作。只需将整个目录复制到另一个位置即可解决问题,这一点非常有效:

f = r"path/to/my/file.xml"
# set XML catatog file path
os.environ['XML_CATALOG_FILES'] = r'C:\DATA\Mydoctypes\catalog.xml'
# configure parser
parser = etree.XMLParser(dtd_validation=True, no_network=True)
# validate
try:
   valid = etree.parse(f, parser=parser)
    print("This file is valid against the DTD.")
except etree.XMLSyntaxError, error:
   print("This file is INVALID against the DTD!")
   print(error)
显然,这并不理想,但确实有效

这可能与文件权限有关,或者可能与Windows中旧的“文件路径太长”问题有关?我还没有尝试过一种象征性的联系是否有效


我使用的是Windows 7、Python 2.7.11和lxml版本(3.6.0)。

如果在构造解析器对象时添加
no_network=False
,会发生什么?请参阅此处的“解析器选项:。啊,非常感谢@mjzn!就这样。你能把它写在一个答案里,这样我就可以给你声誉了吗?