首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Parser: resolveEntity

Parser: resolveEntity
EN

Stack Overflow用户
提问于 2019-10-23 19:55:49
回答 1查看 283关注 0票数 1

我很难弄清楚如何将自己的ResolveEntityHandler绑定到SAX解析器。在那里,这个答案。但不幸的是,我无法在那里复制结果。

当我运行以下代码(实际上是从上述答案中复制的)时,只更新到Python 3,

代码语言:javascript
复制
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: &num;'>Entity: &not;</test>
"""

main(XML)

和外部test.dtd

代码语言:javascript
复制
<!ENTITY num "FOO">
<!ENTITY pic SYSTEM 'bar.gif' NDATA gif>

我得到的是

代码语言:javascript
复制
TestHandler.startElement(): step: 
TestHandler.skippedEntity(): not

Process finished with exit code 0

所以我的问题是:

  1. 为什么从来没有叫过resolveEntity
  2. 如何将ResolveEntityHandler绑定到解析器?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-24 06:25:14

你所看到的与Python 3.7.1中的更改有关

在3.7.1版本中更改: SAX解析器在默认情况下不再处理一般外部实体以增加安全性。在此之前,解析器创建网络连接,从DTD和实体的文件系统中获取远程文件或加载的本地文件。可以使用解析器对象上的方法setFeature()和参数feature_external_ges再次启用该特性。

若要获得与早期版本相同的行为,请添加以下行:

代码语言:javascript
复制
from xml.sax.handler import feature_external_ges

和(在main函数中)

代码语言:javascript
复制
parser.setFeature(feature_external_ges, True)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58530121

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档