Как проверить xml на соответствие файлу DTD в Python

Мне нужно проверить строку XML (а не файл) по файлу описания DTD.

Как это можно сделать в python?


person fulmicoton    schedule 19.08.2008    source источник


Ответы (2)


Другим хорошим вариантом является проверка lxml, которую я нахожу довольно приятной в использовании.

Простой пример, взятый с сайта 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
person Michael Twomey    schedule 19.08.2008

из каталога примеров в привязках Python libxml2:

#!/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
person Community    schedule 06.11.2008
comment
Обратите внимание, что привязки libxml2 не являются частью стандартной библиотеки Python, т. е. не встроены. - person ChuckB; 07.11.2008