这是一个简短但完整的示例,其中使用了@Steven提到的自定义解析器技术。
from StringIO import StringIOfrom lxml import etreedata = dict( xml_file = '''<?xml version="1.0"?><!DOCTYPE x SYSTEM "a.dtd"><x><y>ézz</y></x>''', dtd_file = '''<!ENTITY eacute "é"><!ELEMENT x (y)><!ELEMENT y (#PCDATA)>''')class DTDResolver(etree.Resolver): def resolve(self, url, id, context): return self.resolve_string(data['dtd_file'], context)xmldoc = StringIO(data['xml_file'])parser = etree.XMLParser(dtd_validation=True, load_dtd=True)parser.resolvers.add(DTDResolver())try: tree = etree.parse(xmldoc, parser)except etree.XMLSyntaxError as e: # handle xml and validation errors



