代码之家  ›  专栏  ›  技术社区  ›  Charles Anderson

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

  •  3
  • Charles Anderson  · 技术社区  · 16 年前

    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检查?

    5 回复  |  直到 16 年前
        1
  •  4
  •   Community CDub    8 年前
        2
  •  3
  •   ChuckB    16 年前

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

    gimel Tim

        3
  •  2
  •   Charles Anderson    16 年前

    记录在案,我的代码现在是这样的:

    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
  •  1
  •   Tim Pietzcker    16 年前

        5
  •  0
  •   acrosman    16 年前

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