提问人:Charles Anderson 提问时间:11/18/2008 更新时间:11/19/2008 访问量:5184
Python xml.dom.minidom.parse() 函数忽略 DTD
Python xml.dom.minidom.parse() function ignores DTDs
问:
我有以下 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赞
acrosman
11/18/2008
#1
我相信您需要从 expat 切换到 xmlproc。
请参见:http://code.activestate.com/recipes/220472/
5赞
gimel
11/18/2008
#2
评论
0赞
Charles Anderson
11/18/2008
谢谢。我希望避免在标准库之外工作,但 lxml 确实可以解决问题。也更容易阅读。
1赞
Tim Pietzcker
11/18/2008
#3
我推荐 lxml 而不是 xmlproc,因为不再开发 PyXML 包(包含 xmlproc);PyXML 可以使用的最新 Python 版本是 2.4。
3赞
ChuckB
11/18/2008
#4
简单解释一下:Python xml.dom.minidom 和 xml.sax 默认使用 expat 解析器,这是一个非验证解析器。它可能会读取 DTD 以执行实体替换,但不会针对 DTD 进行验证。
gimel 和 Tim 推荐 lxml,它是 libxml2 和 libxslt 库的一个很好的 pythonic 绑定。它支持针对 DTD 进行验证。我一直在使用 lxml,我非常喜欢它。
2赞
Charles Anderson
11/19/2008
#5
只是为了记录,这是我的代码现在的样子:
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]
评论