📄 reader2.py
字号:
#!/usr/bin/python -u## this tests the DTD validation with the XmlTextReader interface#import sysimport globimport stringimport StringIOimport libxml2# Memory debug specificlibxml2.debugMemory(1)err=""expect="""../../test/valid/rss.xml:177: element rss: validity error : Element rss does not carry attribute version</rss> ^../../test/valid/xlink.xml:450: element termdef: validity error : ID dt-arc already defined <p><termdef id="dt-arc" term="Arc">An <ter ^../../test/valid/xlink.xml:530: validity error : attribute def line 199 references an unknown ID "dt-xlg"^"""def callback(ctx, str): global err err = err + "%s" % (str)libxml2.registerErrorHandler(callback, "")valid_files = glob.glob("../../test/valid/*.x*")valid_files.sort()for file in valid_files: if string.find(file, "t8") != -1: continue reader = libxml2.newTextReaderFilename(file) #print "%s:" % (file) reader.SetParserProp(libxml2.PARSER_VALIDATE, 1) ret = reader.Read() while ret == 1: ret = reader.Read() if ret != 0: print "Error parsing and validating %s" % (file) #sys.exit(1)if err != expect: print err## another separate test based on Stephane Bidoul one#s = """<!DOCTYPE test [<!ELEMENT test (x,b)><!ELEMENT x (c)><!ELEMENT b (#PCDATA)><!ELEMENT c (#PCDATA)><!ENTITY x "<x><c>xxx</c></x>">]><test> &x; <b>bbb</b></test>"""expect="""10,test1,test14,#text1,x1,c3,#text15,c15,x14,#text1,b3,#text15,b14,#text15,test"""res=""err=""input = libxml2.inputBuffer(StringIO.StringIO(s))reader = input.newTextReader("test2")reader.SetParserProp(libxml2.PARSER_LOADDTD,1)reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS,1)reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)reader.SetParserProp(libxml2.PARSER_VALIDATE,1)while reader.Read() == 1: res = res + "%s,%s\n" % (reader.NodeType(),reader.Name())if res != expect: print "test2 failed: unexpected output" print res sys.exit(1)if err != "": print "test2 failed: validation error found" print err sys.exit(1)## Another test for external entity parsing and validation#s = """<!DOCTYPE test [<!ELEMENT test (x)><!ELEMENT x (#PCDATA)><!ENTITY e SYSTEM "tst.ent">]><test> &e;</test>"""tst_ent = """<x>hello</x>"""expect="""10 test1 test14 #text1 x3 #text15 x14 #text15 test"""res=""def myResolver(URL, ID, ctxt): if URL == "tst.ent": return(StringIO.StringIO(tst_ent)) return Nonelibxml2.setEntityLoader(myResolver)input = libxml2.inputBuffer(StringIO.StringIO(s))reader = input.newTextReader("test3")reader.SetParserProp(libxml2.PARSER_LOADDTD,1)reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS,1)reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)reader.SetParserProp(libxml2.PARSER_VALIDATE,1)while reader.Read() == 1: res = res + "%s %s\n" % (reader.NodeType(),reader.Name())if res != expect: print "test3 failed: unexpected output" print res sys.exit(1)if err != "": print "test3 failed: validation error found" print err sys.exit(1)## Another test for recursive entity parsing, validation, and replacement of# entities, making sure the entity ref node doesn't show up in that case#s = """<!DOCTYPE test [<!ELEMENT test (x, x)><!ELEMENT x (y)><!ELEMENT y (#PCDATA)><!ENTITY x "<x>&y;</x>"><!ENTITY y "<y>yyy</y>">]><test> &x; &x;</test>"""expect="""10 test 01 test 014 #text 11 x 11 y 23 #text 315 y 215 x 114 #text 11 x 11 y 23 #text 315 y 215 x 114 #text 115 test 0"""res=""err=""input = libxml2.inputBuffer(StringIO.StringIO(s))reader = input.newTextReader("test4")reader.SetParserProp(libxml2.PARSER_LOADDTD,1)reader.SetParserProp(libxml2.PARSER_DEFAULTATTRS,1)reader.SetParserProp(libxml2.PARSER_SUBST_ENTITIES,1)reader.SetParserProp(libxml2.PARSER_VALIDATE,1)while reader.Read() == 1: res = res + "%s %s %d\n" % (reader.NodeType(),reader.Name(),reader.Depth())if res != expect: print "test4 failed: unexpected output" print res sys.exit(1)if err != "": print "test4 failed: validation error found" print err sys.exit(1)## The same test but without entity substitution this time#s = """<!DOCTYPE test [<!ELEMENT test (x, x)><!ELEMENT x (y)><!ELEMENT y (#PCDATA)><!ENTITY x "<x>&y;</x>"><!ENTITY y "<y>yyy</y>">]><test> &x; &x;</test>"""expect="""10 test 01 test 014 #text 15 x 114 #text 15 x 114 #text 115 test 0"""res=""err=""input = libxml2.inputBuffer(StringIO.StringIO(s))reader = input.newTextReader("test5")reader.SetParserProp(libxml2.PARSER_VALIDATE,1)while reader.Read() == 1: res = res + "%s %s %d\n" % (reader.NodeType(),reader.Name(),reader.Depth())if res != expect: print "test5 failed: unexpected output" print resif err != "": print "test5 failed: validation error found" print err## cleanup#del inputdel reader# Memory debug specificlibxml2.cleanupParser()if libxml2.debugMemory(1) == 0: print "OK"else: print "Memory leak %d bytes" % (libxml2.debugMemory(1)) libxml2.dumpMemory()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -