Python SAX解析器:resolveEntity
我很难弄清楚如何将自己的ResolveEntityHandler绑定到SAX解析器。就这样。但不幸的是,我无法在那里重现结果 当我运行下面的代码时,它实际上是从前面的答案复制的,刚刚更新到Python 3Python SAX解析器:resolveEntity,python,xml,sax,entityresolver,Python,Xml,Sax,Entityresolver,我很难弄清楚如何将自己的ResolveEntityHandler绑定到SAX解析器。就这样。但不幸的是,我无法在那里重现结果 当我运行下面的代码时,它实际上是从前面的答案复制的,刚刚更新到Python 3 import io import xml.sax from xml.sax.handler import ContentHandler # Inheriting from EntityResolver and DTDHandler is not necessary class TestHan
import io
import xml.sax
from xml.sax.handler import ContentHandler
# Inheriting from EntityResolver and DTDHandler is not necessary
class TestHandler(ContentHandler):
# This method is only called for external entities. Must return a value.
def resolveEntity(self, publicID, systemID):
print ("TestHandler.resolveEntity(): %s %s" % (publicID, systemID))
return systemID
def skippedEntity(self, name):
print ("TestHandler.skippedEntity(): %s" % (name))
def unparsedEntityDecl(self, name, publicID, systemID, ndata):
print ("TestHandler.unparsedEntityDecl(): %s %s" % (publicID, systemID))
def startElement(self, name, attrs):
summary = attrs.get('summary', '')
print ('TestHandler.startElement():', summary)
def main(xml_string):
try:
parser = xml.sax.make_parser()
curHandler = TestHandler()
parser.setContentHandler(curHandler)
parser.setEntityResolver(curHandler)
parser.setDTDHandler(curHandler)
stream = io.StringIO(xml_string)
parser.parse(stream)
stream.close()
except xml.sax.SAXParseException as e:
print ("ERROR %s" % e)
XML = """<!DOCTYPE test SYSTEM "test.dtd">
<test summary='step: #'>Entity: ¬</test>
"""
main(XML)
我得到的是
TestHandler.startElement(): step:
TestHandler.skippedEntity(): not
Process finished with exit code 0
因此,我的问题是:
resolveEntity
您所看到的与以下内容有关: 在版本3.7.1中更改:默认情况下,SAX解析器不再处理一般的外部实体以提高安全性。在此之前,解析器创建网络连接以从文件系统获取DTD和实体的远程文件或加载的本地文件。可以使用解析器对象和参数
feature\u external\ges
上的方法setFeature()
再次启用该功能
要获得与早期版本相同的行为,请添加以下行:
from xml.sax.handler import feature_external_ges
和(在主功能中)
from xml.sax.handler import feature_external_ges
parser.setFeature(feature_external_ges, True)