【问题标题】:Python SAX Parser: resolveEntityPython SAX 解析器:resolveEntity
【发布时间】:2019-10-23 19:55:49
【问题描述】:

我很难弄清楚如何将我自己的 ResolveEntityHandler 绑定到 SAX 解析器。在 SO 那里有this answer。但不幸的是,我无法在那里重现结果。

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

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

<!ENTITY num "FOO">
<!ENTITY pic SYSTEM 'bar.gif' NDATA gif>

我得到的是

TestHandler.startElement(): step: 
TestHandler.skippedEntity(): not

Process finished with exit code 0

所以我的问题是:

  1. 为什么从未调用过resolveEntity
  2. 如何将 ResolveEntityHandler 绑定到您的解析器?

【问题讨论】:

    标签: python xml sax entityresolver


    【解决方案1】:

    您所看到的与change in Python 3.7.1 有关:

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

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

    from xml.sax.handler import feature_external_ges
    

    和(在main 函数中)

    parser.setFeature(feature_external_ges, True)
    

    【讨论】:

      猜你喜欢
      • 2011-08-14
      • 1970-01-01
      • 2015-04-12
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 2014-03-29
      • 1970-01-01
      • 2011-04-30
      相关资源
      最近更新 更多