【问题标题】:Python xml.dom.minidom.parse() function ignores DTDsPython xml.dom.minidom.parse() 函数忽略 DTD
【发布时间】:2008-11-18 13:56:04
【问题描述】:

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

【问题讨论】:

    标签: python xml


    【解决方案1】:

    this question - 接受的答案是使用lxml validation

    【讨论】:

    • 谢谢。我希望避免在标准库之外工作,但 lxml 确实可以解决问题。也更容易阅读。
    【解决方案2】:

    仅作为解释:Python xml.dom.minidom 和 xml.sax 默认使用 expat 解析器,这是一个非验证解析器。它可能会读取 DTD 以进行实体替换,但不会根据 DTD 进行验证。

    gimelTim 推荐 lxml,它是 libxml2 和 libxslt 库的一个很好的 Pythonic 绑定。它支持针对 DTD 的验证。我一直在用lxml,非常喜欢。

    【讨论】:

      【解决方案3】:

      为了记录,这就是我的代码现在的样子:

      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]
      

      【讨论】:

        【解决方案4】:

        我推荐 lxml 而不是 xmlproc,因为 PyXML 包(包含 xmlproc)不再被开发; PyXML 可以使用的最新 Python 版本是 2.4。

        【讨论】:

          【解决方案5】:

          我认为您需要从 expat 切换到 xmlproc。
          看: http://code.activestate.com/recipes/220472/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-09-14
            • 2023-03-22
            • 2012-07-04
            • 2018-08-22
            • 2013-04-18
            • 2011-04-23
            相关资源
            最近更新 更多