代码之家  ›  专栏  ›  技术社区  ›  fulmicoton

如何根据Python中的DTD文件验证XML

  •  30
  • fulmicoton  · 技术社区  · 16 年前

    我需要验证XML字符串(而不是文件) 针对DTD描述文件。

    怎么能做到呢 python ?

    2 回复  |  直到 8 年前
        1
  •  30
  •   robsn Michael Twomey    8 年前

    另一个好的选择是 lxml's validation 我觉得很好用。

    一个简单的例子来自lxml站点:

    from StringIO import StringIO
    
    from lxml import etree
    
    dtd = etree.DTD(StringIO("""<!ELEMENT foo EMPTY>"""))
    root = etree.XML("<foo/>")
    print(dtd.validate(root))
    # True
    
    root = etree.XML("<foo>bar</foo>")
    print(dtd.validate(root))
    # False
    print(dtd.error_log.filter_from_errors())
    # <string>:1:0:ERROR:VALID:DTD_NOT_EMPTY: Element foo was declared EMPTY this one has content
    
        2
  •  7
  •   guest    16 年前

    在libxml2 python绑定的examples目录中:

    #!/usr/bin/python -u
    import libxml2
    import sys
    
    # Memory debug specific
    libxml2.debugMemory(1)
    
    dtd="""<!ELEMENT foo EMPTY>"""
    instance="""<?xml version="1.0"?>
    <foo></foo>"""
    
    dtd = libxml2.parseDTD(None, 'test.dtd')
    ctxt = libxml2.newValidCtxt()
    doc = libxml2.parseDoc(instance)
    ret = doc.validateDtd(ctxt, dtd)
    if ret != 1:
        print "error doing DTD validation"
        sys.exit(1)
    
    doc.freeDoc()
    dtd.freeDtd()
    del dtd
    del ctxt