使用python解析XMLxml.sax文件,但我的代码无法捕获实体。为什么skippedEntity()或resolveEntity()没有在下面报告:
import os
import cStringIO
import xml.sax
from xml.sax.handler import ContentHandler,EntityResolver,DTDHandler
#Class to parse and run test XML files
class TestHandler(ContentHandler,EntityResolver,DTDHandler):
#SAX handler - Entity resolver
def resolveEntity(self,publicID,systemID):
print "TestHandler.resolveEntity: %s %s" % (publicID,systemID)
def skippedEntity(self, name):
print "TestHandler.skippedEntity: %s" % (name)
def unparsedEntityDecl(self,publicID,systemID,ndata):
print "TestHandler.unparsedEntityDecl: %s %s" % (publicID,systemID)
def startElement(self,name,attrs):
# name = string.lower(name)
summary = '' + attrs.get('summary','')
arg = '' + attrs.get('arg','')
print 'TestHandler.startElement(), %s : %s (%s)' % (name,summary,arg)
def run(xml_string):
try:
parser = xml.sax.make_parser()
stream = cStringIO.StringIO(xml_string)
curHandler = TestHandler()
parser.setContentHandler(curHandler)
parser.setDTDHandler( curHandler )
parser.setEntityResolver( curHandler )
parser.parse(stream)
stream.close()
except (xml.sax.SAXParseException), e:
print "*** PARSER error: %s" % e;
def main():
try:
XML = "<!DOCTYPE page[ <!ENTITY num 'foo'> ]><test summary='step: #'>Entity: ¬</test>"
run(XML)
except Exception, e:
print 'FATAL ERROR: %s' % (str(e))
if __name__== '__main__':
main()
跑步时,我只看到:
^{pr2}$为什么我看不到&num;的resolveEntity打印,或¬;的跳过条目打印;?在
我认为resolveEntity和skippedEntity只对外部DTD调用。我通过修改XML来实现这一点。在
外部.dtd包含两个简单的实体声明。在
^{pr2}$同时,我摆脱了resolveEntity。在
该输出-
希望这有帮助。在
这是你的程序的一个修改版本,我希望有意义。它演示了一个调用所有
TestHandler
方法的情况。在测试.dtd包含:
^{pr2}$输出:
添加
据我所知,只有在使用外部DTD时才会调用
skippedEntity
(至少我不能想出反例;如果{a1}再清楚一点就好了)。在Adam在他的回答中说,}。例如:
resolveEntity
只对外部dtd调用。但事实并非如此。^当处理对在内部或外部DTD子集中声明的外部实体的引用时,也会调用{其中的内容条形图.txt可以是
FOO
。在本例中it is not possible to refer to the entity in an attribute value。在相关问题 更多 >
编程相关推荐