用python xml.sax解析XML实体
|
使用xml.sax使用python解析XML,但是我的代码无法捕获实体。为什么在以下情况中未跳过skipEntity()或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()
运行时,我看到的是:
TestHandler.startElement(), step: foo ()
*** PARSER error: <unknown>:1:36: undefined entity
为什么我看不到#的resolveEntity打印?或跳过的&not;条目打印?
没有找到相关结果
已邀请:
2 个回复
钾涎净介
external.dtd包含两个简单的实体声明。
另外,我摆脱了resolveEntity。 输出-
希望这可以帮助。
骇毖煽洁铂
方法的情况。
test.dtd包含:
输出:
加成 据我所知,仅当使用外部DTD时才调用ѭ9(至少我不能提出反例;如果文档更清晰一点,那将是很好的)。 亚当在回答中说,“ 10”仅用于外部DTD。但这不是真的。在处理对在内部或外部DTD子集中声明的外部实体的引用时,也会调用“ 10”。例如:
bar.txt的内容可能是“ 13”。在这种情况下,不可能在属性值中引用实体。