1*7c568831SAndroid Build Coastguard Workerimport libxml2mod 2*7c568831SAndroid Build Coastguard Workerimport types 3*7c568831SAndroid Build Coastguard Workerimport sys 4*7c568831SAndroid Build Coastguard Worker 5*7c568831SAndroid Build Coastguard Worker# The root of all libxml2 errors. 6*7c568831SAndroid Build Coastguard Workerclass libxmlError(Exception): pass 7*7c568831SAndroid Build Coastguard Worker 8*7c568831SAndroid Build Coastguard Worker# Type of the wrapper class for the C objects wrappers 9*7c568831SAndroid Build Coastguard Workerdef checkWrapper(obj): 10*7c568831SAndroid Build Coastguard Worker try: 11*7c568831SAndroid Build Coastguard Worker n = type(_obj).__name__ 12*7c568831SAndroid Build Coastguard Worker if n != 'PyCObject' and n != 'PyCapsule': 13*7c568831SAndroid Build Coastguard Worker return 1 14*7c568831SAndroid Build Coastguard Worker except: 15*7c568831SAndroid Build Coastguard Worker return 0 16*7c568831SAndroid Build Coastguard Worker return 0 17*7c568831SAndroid Build Coastguard Worker 18*7c568831SAndroid Build Coastguard Worker# 19*7c568831SAndroid Build Coastguard Worker# id() is sometimes negative ... 20*7c568831SAndroid Build Coastguard Worker# 21*7c568831SAndroid Build Coastguard Workerdef pos_id(o): 22*7c568831SAndroid Build Coastguard Worker i = id(o) 23*7c568831SAndroid Build Coastguard Worker if (i < 0): 24*7c568831SAndroid Build Coastguard Worker return (sys.maxsize - i) 25*7c568831SAndroid Build Coastguard Worker return i 26*7c568831SAndroid Build Coastguard Worker 27*7c568831SAndroid Build Coastguard Worker# 28*7c568831SAndroid Build Coastguard Worker# Errors raised by the wrappers when some tree handling failed. 29*7c568831SAndroid Build Coastguard Worker# 30*7c568831SAndroid Build Coastguard Workerclass treeError(libxmlError): 31*7c568831SAndroid Build Coastguard Worker def __init__(self, msg): 32*7c568831SAndroid Build Coastguard Worker self.msg = msg 33*7c568831SAndroid Build Coastguard Worker def __str__(self): 34*7c568831SAndroid Build Coastguard Worker return self.msg 35*7c568831SAndroid Build Coastguard Worker 36*7c568831SAndroid Build Coastguard Workerclass parserError(libxmlError): 37*7c568831SAndroid Build Coastguard Worker def __init__(self, msg): 38*7c568831SAndroid Build Coastguard Worker self.msg = msg 39*7c568831SAndroid Build Coastguard Worker def __str__(self): 40*7c568831SAndroid Build Coastguard Worker return self.msg 41*7c568831SAndroid Build Coastguard Worker 42*7c568831SAndroid Build Coastguard Workerclass uriError(libxmlError): 43*7c568831SAndroid Build Coastguard Worker def __init__(self, msg): 44*7c568831SAndroid Build Coastguard Worker self.msg = msg 45*7c568831SAndroid Build Coastguard Worker def __str__(self): 46*7c568831SAndroid Build Coastguard Worker return self.msg 47*7c568831SAndroid Build Coastguard Worker 48*7c568831SAndroid Build Coastguard Workerclass xpathError(libxmlError): 49*7c568831SAndroid Build Coastguard Worker def __init__(self, msg): 50*7c568831SAndroid Build Coastguard Worker self.msg = msg 51*7c568831SAndroid Build Coastguard Worker def __str__(self): 52*7c568831SAndroid Build Coastguard Worker return self.msg 53*7c568831SAndroid Build Coastguard Worker 54*7c568831SAndroid Build Coastguard Workerclass ioWrapper: 55*7c568831SAndroid Build Coastguard Worker def __init__(self, _obj): 56*7c568831SAndroid Build Coastguard Worker self.__io = _obj 57*7c568831SAndroid Build Coastguard Worker self._o = None 58*7c568831SAndroid Build Coastguard Worker 59*7c568831SAndroid Build Coastguard Worker def io_close(self): 60*7c568831SAndroid Build Coastguard Worker if self.__io == None: 61*7c568831SAndroid Build Coastguard Worker return(-1) 62*7c568831SAndroid Build Coastguard Worker self.__io.close() 63*7c568831SAndroid Build Coastguard Worker self.__io = None 64*7c568831SAndroid Build Coastguard Worker return(0) 65*7c568831SAndroid Build Coastguard Worker 66*7c568831SAndroid Build Coastguard Worker def io_flush(self): 67*7c568831SAndroid Build Coastguard Worker if self.__io == None: 68*7c568831SAndroid Build Coastguard Worker return(-1) 69*7c568831SAndroid Build Coastguard Worker self.__io.flush() 70*7c568831SAndroid Build Coastguard Worker return(0) 71*7c568831SAndroid Build Coastguard Worker 72*7c568831SAndroid Build Coastguard Worker def io_read(self, len = -1): 73*7c568831SAndroid Build Coastguard Worker if self.__io == None: 74*7c568831SAndroid Build Coastguard Worker return(-1) 75*7c568831SAndroid Build Coastguard Worker try: 76*7c568831SAndroid Build Coastguard Worker if len < 0: 77*7c568831SAndroid Build Coastguard Worker ret = self.__io.read() 78*7c568831SAndroid Build Coastguard Worker else: 79*7c568831SAndroid Build Coastguard Worker ret = self.__io.read(len) 80*7c568831SAndroid Build Coastguard Worker except Exception: 81*7c568831SAndroid Build Coastguard Worker import sys 82*7c568831SAndroid Build Coastguard Worker e = sys.exc_info()[1] 83*7c568831SAndroid Build Coastguard Worker print("failed to read from Python:", type(e)) 84*7c568831SAndroid Build Coastguard Worker print("on IO:", self.__io) 85*7c568831SAndroid Build Coastguard Worker self.__io == None 86*7c568831SAndroid Build Coastguard Worker return(-1) 87*7c568831SAndroid Build Coastguard Worker 88*7c568831SAndroid Build Coastguard Worker return(ret) 89*7c568831SAndroid Build Coastguard Worker 90*7c568831SAndroid Build Coastguard Worker def io_write(self, str, len = -1): 91*7c568831SAndroid Build Coastguard Worker if self.__io == None: 92*7c568831SAndroid Build Coastguard Worker return(-1) 93*7c568831SAndroid Build Coastguard Worker if len < 0: 94*7c568831SAndroid Build Coastguard Worker return(self.__io.write(str)) 95*7c568831SAndroid Build Coastguard Worker return(self.__io.write(str, len)) 96*7c568831SAndroid Build Coastguard Worker 97*7c568831SAndroid Build Coastguard Workerclass ioReadWrapper(ioWrapper): 98*7c568831SAndroid Build Coastguard Worker def __init__(self, _obj, enc = ""): 99*7c568831SAndroid Build Coastguard Worker ioWrapper.__init__(self, _obj) 100*7c568831SAndroid Build Coastguard Worker self._o = libxml2mod.xmlCreateInputBuffer(self, enc) 101*7c568831SAndroid Build Coastguard Worker 102*7c568831SAndroid Build Coastguard Worker def __del__(self): 103*7c568831SAndroid Build Coastguard Worker print("__del__") 104*7c568831SAndroid Build Coastguard Worker self.io_close() 105*7c568831SAndroid Build Coastguard Worker if self._o != None: 106*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlFreeParserInputBuffer(self._o) 107*7c568831SAndroid Build Coastguard Worker self._o = None 108*7c568831SAndroid Build Coastguard Worker 109*7c568831SAndroid Build Coastguard Worker def close(self): 110*7c568831SAndroid Build Coastguard Worker self.io_close() 111*7c568831SAndroid Build Coastguard Worker if self._o != None: 112*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlFreeParserInputBuffer(self._o) 113*7c568831SAndroid Build Coastguard Worker self._o = None 114*7c568831SAndroid Build Coastguard Worker 115*7c568831SAndroid Build Coastguard Workerclass ioWriteWrapper(ioWrapper): 116*7c568831SAndroid Build Coastguard Worker def __init__(self, _obj, enc = ""): 117*7c568831SAndroid Build Coastguard Worker# print "ioWriteWrapper.__init__", _obj 118*7c568831SAndroid Build Coastguard Worker if type(_obj) == type(''): 119*7c568831SAndroid Build Coastguard Worker print("write io from a string") 120*7c568831SAndroid Build Coastguard Worker self.o = None 121*7c568831SAndroid Build Coastguard Worker elif type(_obj).__name__ == 'PyCapsule': 122*7c568831SAndroid Build Coastguard Worker file = libxml2mod.outputBufferGetPythonFile(_obj) 123*7c568831SAndroid Build Coastguard Worker if file != None: 124*7c568831SAndroid Build Coastguard Worker ioWrapper.__init__(self, file) 125*7c568831SAndroid Build Coastguard Worker else: 126*7c568831SAndroid Build Coastguard Worker ioWrapper.__init__(self, _obj) 127*7c568831SAndroid Build Coastguard Worker self._o = _obj 128*7c568831SAndroid Build Coastguard Worker# elif type(_obj) == types.InstanceType: 129*7c568831SAndroid Build Coastguard Worker# print(("write io from instance of %s" % (_obj.__class__))) 130*7c568831SAndroid Build Coastguard Worker# ioWrapper.__init__(self, _obj) 131*7c568831SAndroid Build Coastguard Worker# self._o = libxml2mod.xmlCreateOutputBuffer(self, enc) 132*7c568831SAndroid Build Coastguard Worker else: 133*7c568831SAndroid Build Coastguard Worker file = libxml2mod.outputBufferGetPythonFile(_obj) 134*7c568831SAndroid Build Coastguard Worker if file != None: 135*7c568831SAndroid Build Coastguard Worker ioWrapper.__init__(self, file) 136*7c568831SAndroid Build Coastguard Worker else: 137*7c568831SAndroid Build Coastguard Worker ioWrapper.__init__(self, _obj) 138*7c568831SAndroid Build Coastguard Worker self._o = _obj 139*7c568831SAndroid Build Coastguard Worker 140*7c568831SAndroid Build Coastguard Worker def __del__(self): 141*7c568831SAndroid Build Coastguard Worker# print "__del__" 142*7c568831SAndroid Build Coastguard Worker self.io_close() 143*7c568831SAndroid Build Coastguard Worker if self._o != None: 144*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlOutputBufferClose(self._o) 145*7c568831SAndroid Build Coastguard Worker self._o = None 146*7c568831SAndroid Build Coastguard Worker 147*7c568831SAndroid Build Coastguard Worker def flush(self): 148*7c568831SAndroid Build Coastguard Worker self.io_flush() 149*7c568831SAndroid Build Coastguard Worker if self._o != None: 150*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlOutputBufferClose(self._o) 151*7c568831SAndroid Build Coastguard Worker self._o = None 152*7c568831SAndroid Build Coastguard Worker 153*7c568831SAndroid Build Coastguard Worker def close(self): 154*7c568831SAndroid Build Coastguard Worker self.io_flush() 155*7c568831SAndroid Build Coastguard Worker if self._o != None: 156*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlOutputBufferClose(self._o) 157*7c568831SAndroid Build Coastguard Worker self._o = None 158*7c568831SAndroid Build Coastguard Worker 159*7c568831SAndroid Build Coastguard Worker# 160*7c568831SAndroid Build Coastguard Worker# Example of a class to handle SAX events 161*7c568831SAndroid Build Coastguard Worker# 162*7c568831SAndroid Build Coastguard Workerclass SAXCallback: 163*7c568831SAndroid Build Coastguard Worker """Base class for SAX handlers""" 164*7c568831SAndroid Build Coastguard Worker def startDocument(self): 165*7c568831SAndroid Build Coastguard Worker """called at the start of the document""" 166*7c568831SAndroid Build Coastguard Worker pass 167*7c568831SAndroid Build Coastguard Worker 168*7c568831SAndroid Build Coastguard Worker def endDocument(self): 169*7c568831SAndroid Build Coastguard Worker """called at the end of the document""" 170*7c568831SAndroid Build Coastguard Worker pass 171*7c568831SAndroid Build Coastguard Worker 172*7c568831SAndroid Build Coastguard Worker def startElement(self, tag, attrs): 173*7c568831SAndroid Build Coastguard Worker """called at the start of every element, tag is the name of 174*7c568831SAndroid Build Coastguard Worker the element, attrs is a dictionary of the element's attributes""" 175*7c568831SAndroid Build Coastguard Worker pass 176*7c568831SAndroid Build Coastguard Worker 177*7c568831SAndroid Build Coastguard Worker def endElement(self, tag): 178*7c568831SAndroid Build Coastguard Worker """called at the start of every element, tag is the name of 179*7c568831SAndroid Build Coastguard Worker the element""" 180*7c568831SAndroid Build Coastguard Worker pass 181*7c568831SAndroid Build Coastguard Worker 182*7c568831SAndroid Build Coastguard Worker def characters(self, data): 183*7c568831SAndroid Build Coastguard Worker """called when character data have been read, data is the string 184*7c568831SAndroid Build Coastguard Worker containing the data, multiple consecutive characters() callback 185*7c568831SAndroid Build Coastguard Worker are possible.""" 186*7c568831SAndroid Build Coastguard Worker pass 187*7c568831SAndroid Build Coastguard Worker 188*7c568831SAndroid Build Coastguard Worker def cdataBlock(self, data): 189*7c568831SAndroid Build Coastguard Worker """called when CDATA section have been read, data is the string 190*7c568831SAndroid Build Coastguard Worker containing the data, multiple consecutive cdataBlock() callback 191*7c568831SAndroid Build Coastguard Worker are possible.""" 192*7c568831SAndroid Build Coastguard Worker pass 193*7c568831SAndroid Build Coastguard Worker 194*7c568831SAndroid Build Coastguard Worker def reference(self, name): 195*7c568831SAndroid Build Coastguard Worker """called when an entity reference has been found""" 196*7c568831SAndroid Build Coastguard Worker pass 197*7c568831SAndroid Build Coastguard Worker 198*7c568831SAndroid Build Coastguard Worker def ignorableWhitespace(self, data): 199*7c568831SAndroid Build Coastguard Worker """called when potentially ignorable white spaces have been found""" 200*7c568831SAndroid Build Coastguard Worker pass 201*7c568831SAndroid Build Coastguard Worker 202*7c568831SAndroid Build Coastguard Worker def processingInstruction(self, target, data): 203*7c568831SAndroid Build Coastguard Worker """called when a PI has been found, target contains the PI name and 204*7c568831SAndroid Build Coastguard Worker data is the associated data in the PI""" 205*7c568831SAndroid Build Coastguard Worker pass 206*7c568831SAndroid Build Coastguard Worker 207*7c568831SAndroid Build Coastguard Worker def comment(self, content): 208*7c568831SAndroid Build Coastguard Worker """called when a comment has been found, content contains the comment""" 209*7c568831SAndroid Build Coastguard Worker pass 210*7c568831SAndroid Build Coastguard Worker 211*7c568831SAndroid Build Coastguard Worker def externalSubset(self, name, externalID, systemID): 212*7c568831SAndroid Build Coastguard Worker """called when a DOCTYPE declaration has been found, name is the 213*7c568831SAndroid Build Coastguard Worker DTD name and externalID, systemID are the DTD public and system 214*7c568831SAndroid Build Coastguard Worker identifier for that DTd if available""" 215*7c568831SAndroid Build Coastguard Worker pass 216*7c568831SAndroid Build Coastguard Worker 217*7c568831SAndroid Build Coastguard Worker def internalSubset(self, name, externalID, systemID): 218*7c568831SAndroid Build Coastguard Worker """called when a DOCTYPE declaration has been found, name is the 219*7c568831SAndroid Build Coastguard Worker DTD name and externalID, systemID are the DTD public and system 220*7c568831SAndroid Build Coastguard Worker identifier for that DTD if available""" 221*7c568831SAndroid Build Coastguard Worker pass 222*7c568831SAndroid Build Coastguard Worker 223*7c568831SAndroid Build Coastguard Worker def entityDecl(self, name, type, externalID, systemID, content): 224*7c568831SAndroid Build Coastguard Worker """called when an ENTITY declaration has been found, name is the 225*7c568831SAndroid Build Coastguard Worker entity name and externalID, systemID are the entity public and 226*7c568831SAndroid Build Coastguard Worker system identifier for that entity if available, type indicates 227*7c568831SAndroid Build Coastguard Worker the entity type, and content reports it's string content""" 228*7c568831SAndroid Build Coastguard Worker pass 229*7c568831SAndroid Build Coastguard Worker 230*7c568831SAndroid Build Coastguard Worker def notationDecl(self, name, externalID, systemID): 231*7c568831SAndroid Build Coastguard Worker """called when an NOTATION declaration has been found, name is the 232*7c568831SAndroid Build Coastguard Worker notation name and externalID, systemID are the notation public and 233*7c568831SAndroid Build Coastguard Worker system identifier for that notation if available""" 234*7c568831SAndroid Build Coastguard Worker pass 235*7c568831SAndroid Build Coastguard Worker 236*7c568831SAndroid Build Coastguard Worker def attributeDecl(self, elem, name, type, defi, defaultValue, nameList): 237*7c568831SAndroid Build Coastguard Worker """called when an ATTRIBUTE definition has been found""" 238*7c568831SAndroid Build Coastguard Worker pass 239*7c568831SAndroid Build Coastguard Worker 240*7c568831SAndroid Build Coastguard Worker def elementDecl(self, name, type, content): 241*7c568831SAndroid Build Coastguard Worker """called when an ELEMENT definition has been found""" 242*7c568831SAndroid Build Coastguard Worker pass 243*7c568831SAndroid Build Coastguard Worker 244*7c568831SAndroid Build Coastguard Worker def entityDecl(self, name, publicId, systemID, notationName): 245*7c568831SAndroid Build Coastguard Worker """called when an unparsed ENTITY declaration has been found, 246*7c568831SAndroid Build Coastguard Worker name is the entity name and publicId,, systemID are the entity 247*7c568831SAndroid Build Coastguard Worker public and system identifier for that entity if available, 248*7c568831SAndroid Build Coastguard Worker and notationName indicate the associated NOTATION""" 249*7c568831SAndroid Build Coastguard Worker pass 250*7c568831SAndroid Build Coastguard Worker 251*7c568831SAndroid Build Coastguard Worker def warning(self, msg): 252*7c568831SAndroid Build Coastguard Worker #print msg 253*7c568831SAndroid Build Coastguard Worker pass 254*7c568831SAndroid Build Coastguard Worker 255*7c568831SAndroid Build Coastguard Worker def error(self, msg): 256*7c568831SAndroid Build Coastguard Worker raise parserError(msg) 257*7c568831SAndroid Build Coastguard Worker 258*7c568831SAndroid Build Coastguard Worker def fatalError(self, msg): 259*7c568831SAndroid Build Coastguard Worker raise parserError(msg) 260*7c568831SAndroid Build Coastguard Worker 261*7c568831SAndroid Build Coastguard Worker# 262*7c568831SAndroid Build Coastguard Worker# This class is the ancestor of all the Node classes. It provides 263*7c568831SAndroid Build Coastguard Worker# the basic functionalities shared by all nodes (and handle 264*7c568831SAndroid Build Coastguard Worker# gracefylly the exception), like name, navigation in the tree, 265*7c568831SAndroid Build Coastguard Worker# doc reference, content access and serializing to a string or URI 266*7c568831SAndroid Build Coastguard Worker# 267*7c568831SAndroid Build Coastguard Workerclass xmlCore: 268*7c568831SAndroid Build Coastguard Worker def __init__(self, _obj=None): 269*7c568831SAndroid Build Coastguard Worker if _obj != None: 270*7c568831SAndroid Build Coastguard Worker self._o = _obj; 271*7c568831SAndroid Build Coastguard Worker return 272*7c568831SAndroid Build Coastguard Worker self._o = None 273*7c568831SAndroid Build Coastguard Worker 274*7c568831SAndroid Build Coastguard Worker def __eq__(self, other): 275*7c568831SAndroid Build Coastguard Worker if other == None: 276*7c568831SAndroid Build Coastguard Worker return False 277*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.compareNodesEqual(self._o, other._o) 278*7c568831SAndroid Build Coastguard Worker if ret == None: 279*7c568831SAndroid Build Coastguard Worker return False 280*7c568831SAndroid Build Coastguard Worker return ret == True 281*7c568831SAndroid Build Coastguard Worker def __ne__(self, other): 282*7c568831SAndroid Build Coastguard Worker if other == None: 283*7c568831SAndroid Build Coastguard Worker return True 284*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.compareNodesEqual(self._o, other._o) 285*7c568831SAndroid Build Coastguard Worker return not ret 286*7c568831SAndroid Build Coastguard Worker def __hash__(self): 287*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.nodeHash(self._o) 288*7c568831SAndroid Build Coastguard Worker return ret 289*7c568831SAndroid Build Coastguard Worker 290*7c568831SAndroid Build Coastguard Worker def __str__(self): 291*7c568831SAndroid Build Coastguard Worker return self.serialize() 292*7c568831SAndroid Build Coastguard Worker def get_parent(self): 293*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.parent(self._o) 294*7c568831SAndroid Build Coastguard Worker if ret == None: 295*7c568831SAndroid Build Coastguard Worker return None 296*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 297*7c568831SAndroid Build Coastguard Worker def get_children(self): 298*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.children(self._o) 299*7c568831SAndroid Build Coastguard Worker if ret == None: 300*7c568831SAndroid Build Coastguard Worker return None 301*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 302*7c568831SAndroid Build Coastguard Worker def get_last(self): 303*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.last(self._o) 304*7c568831SAndroid Build Coastguard Worker if ret == None: 305*7c568831SAndroid Build Coastguard Worker return None 306*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 307*7c568831SAndroid Build Coastguard Worker def get_next(self): 308*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.next(self._o) 309*7c568831SAndroid Build Coastguard Worker if ret == None: 310*7c568831SAndroid Build Coastguard Worker return None 311*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 312*7c568831SAndroid Build Coastguard Worker def get_properties(self): 313*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.properties(self._o) 314*7c568831SAndroid Build Coastguard Worker if ret == None: 315*7c568831SAndroid Build Coastguard Worker return None 316*7c568831SAndroid Build Coastguard Worker return xmlAttr(_obj=ret) 317*7c568831SAndroid Build Coastguard Worker def get_prev(self): 318*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.prev(self._o) 319*7c568831SAndroid Build Coastguard Worker if ret == None: 320*7c568831SAndroid Build Coastguard Worker return None 321*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 322*7c568831SAndroid Build Coastguard Worker def get_content(self): 323*7c568831SAndroid Build Coastguard Worker return libxml2mod.xmlNodeGetContent(self._o) 324*7c568831SAndroid Build Coastguard Worker getContent = get_content # why is this duplicate naming needed ? 325*7c568831SAndroid Build Coastguard Worker def get_name(self): 326*7c568831SAndroid Build Coastguard Worker return libxml2mod.name(self._o) 327*7c568831SAndroid Build Coastguard Worker def get_type(self): 328*7c568831SAndroid Build Coastguard Worker return libxml2mod.type(self._o) 329*7c568831SAndroid Build Coastguard Worker def get_doc(self): 330*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.doc(self._o) 331*7c568831SAndroid Build Coastguard Worker if ret == None: 332*7c568831SAndroid Build Coastguard Worker if self.type in ["document_xml", "document_html"]: 333*7c568831SAndroid Build Coastguard Worker return xmlDoc(_obj=self._o) 334*7c568831SAndroid Build Coastguard Worker else: 335*7c568831SAndroid Build Coastguard Worker return None 336*7c568831SAndroid Build Coastguard Worker return xmlDoc(_obj=ret) 337*7c568831SAndroid Build Coastguard Worker # 338*7c568831SAndroid Build Coastguard Worker # Those are common attributes to nearly all type of nodes 339*7c568831SAndroid Build Coastguard Worker # defined as python2 properties 340*7c568831SAndroid Build Coastguard Worker # 341*7c568831SAndroid Build Coastguard Worker import sys 342*7c568831SAndroid Build Coastguard Worker if float(sys.version[0:3]) < 2.2: 343*7c568831SAndroid Build Coastguard Worker def __getattr__(self, attr): 344*7c568831SAndroid Build Coastguard Worker if attr == "parent": 345*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.parent(self._o) 346*7c568831SAndroid Build Coastguard Worker if ret == None: 347*7c568831SAndroid Build Coastguard Worker return None 348*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 349*7c568831SAndroid Build Coastguard Worker elif attr == "properties": 350*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.properties(self._o) 351*7c568831SAndroid Build Coastguard Worker if ret == None: 352*7c568831SAndroid Build Coastguard Worker return None 353*7c568831SAndroid Build Coastguard Worker return xmlAttr(_obj=ret) 354*7c568831SAndroid Build Coastguard Worker elif attr == "children": 355*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.children(self._o) 356*7c568831SAndroid Build Coastguard Worker if ret == None: 357*7c568831SAndroid Build Coastguard Worker return None 358*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 359*7c568831SAndroid Build Coastguard Worker elif attr == "last": 360*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.last(self._o) 361*7c568831SAndroid Build Coastguard Worker if ret == None: 362*7c568831SAndroid Build Coastguard Worker return None 363*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 364*7c568831SAndroid Build Coastguard Worker elif attr == "next": 365*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.next(self._o) 366*7c568831SAndroid Build Coastguard Worker if ret == None: 367*7c568831SAndroid Build Coastguard Worker return None 368*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 369*7c568831SAndroid Build Coastguard Worker elif attr == "prev": 370*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.prev(self._o) 371*7c568831SAndroid Build Coastguard Worker if ret == None: 372*7c568831SAndroid Build Coastguard Worker return None 373*7c568831SAndroid Build Coastguard Worker return nodeWrap(ret) 374*7c568831SAndroid Build Coastguard Worker elif attr == "content": 375*7c568831SAndroid Build Coastguard Worker return libxml2mod.xmlNodeGetContent(self._o) 376*7c568831SAndroid Build Coastguard Worker elif attr == "name": 377*7c568831SAndroid Build Coastguard Worker return libxml2mod.name(self._o) 378*7c568831SAndroid Build Coastguard Worker elif attr == "type": 379*7c568831SAndroid Build Coastguard Worker return libxml2mod.type(self._o) 380*7c568831SAndroid Build Coastguard Worker elif attr == "doc": 381*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.doc(self._o) 382*7c568831SAndroid Build Coastguard Worker if ret == None: 383*7c568831SAndroid Build Coastguard Worker if self.type == "document_xml" or self.type == "document_html": 384*7c568831SAndroid Build Coastguard Worker return xmlDoc(_obj=self._o) 385*7c568831SAndroid Build Coastguard Worker else: 386*7c568831SAndroid Build Coastguard Worker return None 387*7c568831SAndroid Build Coastguard Worker return xmlDoc(_obj=ret) 388*7c568831SAndroid Build Coastguard Worker raise AttributeError(attr) 389*7c568831SAndroid Build Coastguard Worker else: 390*7c568831SAndroid Build Coastguard Worker parent = property(get_parent, None, None, "Parent node") 391*7c568831SAndroid Build Coastguard Worker children = property(get_children, None, None, "First child node") 392*7c568831SAndroid Build Coastguard Worker last = property(get_last, None, None, "Last sibling node") 393*7c568831SAndroid Build Coastguard Worker next = property(get_next, None, None, "Next sibling node") 394*7c568831SAndroid Build Coastguard Worker prev = property(get_prev, None, None, "Previous sibling node") 395*7c568831SAndroid Build Coastguard Worker properties = property(get_properties, None, None, "List of properties") 396*7c568831SAndroid Build Coastguard Worker content = property(get_content, None, None, "Content of this node") 397*7c568831SAndroid Build Coastguard Worker name = property(get_name, None, None, "Node name") 398*7c568831SAndroid Build Coastguard Worker type = property(get_type, None, None, "Node type") 399*7c568831SAndroid Build Coastguard Worker doc = property(get_doc, None, None, "The document this node belongs to") 400*7c568831SAndroid Build Coastguard Worker 401*7c568831SAndroid Build Coastguard Worker # 402*7c568831SAndroid Build Coastguard Worker # Serialization routines, the optional arguments have the following 403*7c568831SAndroid Build Coastguard Worker # meaning: 404*7c568831SAndroid Build Coastguard Worker # encoding: string to ask saving in a specific encoding 405*7c568831SAndroid Build Coastguard Worker # indent: if 1 the serializer is asked to indent the output 406*7c568831SAndroid Build Coastguard Worker # 407*7c568831SAndroid Build Coastguard Worker def serialize(self, encoding = None, format = 0): 408*7c568831SAndroid Build Coastguard Worker return libxml2mod.serializeNode(self._o, encoding, format) 409*7c568831SAndroid Build Coastguard Worker def saveTo(self, file, encoding = None, format = 0): 410*7c568831SAndroid Build Coastguard Worker return libxml2mod.saveNodeTo(self._o, file, encoding, format) 411*7c568831SAndroid Build Coastguard Worker 412*7c568831SAndroid Build Coastguard Worker # 413*7c568831SAndroid Build Coastguard Worker # Canonicalization routines: 414*7c568831SAndroid Build Coastguard Worker # 415*7c568831SAndroid Build Coastguard Worker # nodes: the node set (tuple or list) to be included in the 416*7c568831SAndroid Build Coastguard Worker # canonized image or None if all document nodes should be 417*7c568831SAndroid Build Coastguard Worker # included. 418*7c568831SAndroid Build Coastguard Worker # exclusive: the exclusive flag (0 - non-exclusive 419*7c568831SAndroid Build Coastguard Worker # canonicalization; otherwise - exclusive canonicalization) 420*7c568831SAndroid Build Coastguard Worker # prefixes: the list of inclusive namespace prefixes (strings), 421*7c568831SAndroid Build Coastguard Worker # or None if there is no inclusive namespaces (only for 422*7c568831SAndroid Build Coastguard Worker # exclusive canonicalization, ignored otherwise) 423*7c568831SAndroid Build Coastguard Worker # with_comments: include comments in the result (!=0) or not 424*7c568831SAndroid Build Coastguard Worker # (==0) 425*7c568831SAndroid Build Coastguard Worker def c14nMemory(self, 426*7c568831SAndroid Build Coastguard Worker nodes=None, 427*7c568831SAndroid Build Coastguard Worker exclusive=0, 428*7c568831SAndroid Build Coastguard Worker prefixes=None, 429*7c568831SAndroid Build Coastguard Worker with_comments=0): 430*7c568831SAndroid Build Coastguard Worker if nodes: 431*7c568831SAndroid Build Coastguard Worker nodes = [n._o for n in nodes] 432*7c568831SAndroid Build Coastguard Worker return libxml2mod.xmlC14NDocDumpMemory( 433*7c568831SAndroid Build Coastguard Worker self.get_doc()._o, 434*7c568831SAndroid Build Coastguard Worker nodes, 435*7c568831SAndroid Build Coastguard Worker exclusive != 0, 436*7c568831SAndroid Build Coastguard Worker prefixes, 437*7c568831SAndroid Build Coastguard Worker with_comments != 0) 438*7c568831SAndroid Build Coastguard Worker def c14nSaveTo(self, 439*7c568831SAndroid Build Coastguard Worker file, 440*7c568831SAndroid Build Coastguard Worker nodes=None, 441*7c568831SAndroid Build Coastguard Worker exclusive=0, 442*7c568831SAndroid Build Coastguard Worker prefixes=None, 443*7c568831SAndroid Build Coastguard Worker with_comments=0): 444*7c568831SAndroid Build Coastguard Worker if nodes: 445*7c568831SAndroid Build Coastguard Worker nodes = [n._o for n in nodes] 446*7c568831SAndroid Build Coastguard Worker return libxml2mod.xmlC14NDocSaveTo( 447*7c568831SAndroid Build Coastguard Worker self.get_doc()._o, 448*7c568831SAndroid Build Coastguard Worker nodes, 449*7c568831SAndroid Build Coastguard Worker exclusive != 0, 450*7c568831SAndroid Build Coastguard Worker prefixes, 451*7c568831SAndroid Build Coastguard Worker with_comments != 0, 452*7c568831SAndroid Build Coastguard Worker file) 453*7c568831SAndroid Build Coastguard Worker 454*7c568831SAndroid Build Coastguard Worker # 455*7c568831SAndroid Build Coastguard Worker # Selecting nodes using XPath, a bit slow because the context 456*7c568831SAndroid Build Coastguard Worker # is allocated/freed every time but convenient. 457*7c568831SAndroid Build Coastguard Worker # 458*7c568831SAndroid Build Coastguard Worker def xpathEval(self, expr): 459*7c568831SAndroid Build Coastguard Worker doc = self.doc 460*7c568831SAndroid Build Coastguard Worker if doc == None: 461*7c568831SAndroid Build Coastguard Worker return None 462*7c568831SAndroid Build Coastguard Worker ctxt = doc.xpathNewContext() 463*7c568831SAndroid Build Coastguard Worker ctxt.setContextNode(self) 464*7c568831SAndroid Build Coastguard Worker res = ctxt.xpathEval(expr) 465*7c568831SAndroid Build Coastguard Worker ctxt.xpathFreeContext() 466*7c568831SAndroid Build Coastguard Worker return res 467*7c568831SAndroid Build Coastguard Worker 468*7c568831SAndroid Build Coastguard Worker# # 469*7c568831SAndroid Build Coastguard Worker# # Selecting nodes using XPath, faster because the context 470*7c568831SAndroid Build Coastguard Worker# # is allocated just once per xmlDoc. 471*7c568831SAndroid Build Coastguard Worker# # 472*7c568831SAndroid Build Coastguard Worker# # Removed: DV memleaks c.f. #126735 473*7c568831SAndroid Build Coastguard Worker# # 474*7c568831SAndroid Build Coastguard Worker# def xpathEval2(self, expr): 475*7c568831SAndroid Build Coastguard Worker# doc = self.doc 476*7c568831SAndroid Build Coastguard Worker# if doc == None: 477*7c568831SAndroid Build Coastguard Worker# return None 478*7c568831SAndroid Build Coastguard Worker# try: 479*7c568831SAndroid Build Coastguard Worker# doc._ctxt.setContextNode(self) 480*7c568831SAndroid Build Coastguard Worker# except: 481*7c568831SAndroid Build Coastguard Worker# doc._ctxt = doc.xpathNewContext() 482*7c568831SAndroid Build Coastguard Worker# doc._ctxt.setContextNode(self) 483*7c568831SAndroid Build Coastguard Worker# res = doc._ctxt.xpathEval(expr) 484*7c568831SAndroid Build Coastguard Worker# return res 485*7c568831SAndroid Build Coastguard Worker def xpathEval2(self, expr): 486*7c568831SAndroid Build Coastguard Worker return self.xpathEval(expr) 487*7c568831SAndroid Build Coastguard Worker 488*7c568831SAndroid Build Coastguard Worker # Remove namespaces 489*7c568831SAndroid Build Coastguard Worker def removeNsDef(self, href): 490*7c568831SAndroid Build Coastguard Worker """ 491*7c568831SAndroid Build Coastguard Worker Remove a namespace definition from a node. If href is None, 492*7c568831SAndroid Build Coastguard Worker remove all of the ns definitions on that node. The removed 493*7c568831SAndroid Build Coastguard Worker namespaces are returned as a linked list. 494*7c568831SAndroid Build Coastguard Worker 495*7c568831SAndroid Build Coastguard Worker Note: If any child nodes referred to the removed namespaces, 496*7c568831SAndroid Build Coastguard Worker they will be left with dangling links. You should call 497*7c568831SAndroid Build Coastguard Worker renconciliateNs() to fix those pointers. 498*7c568831SAndroid Build Coastguard Worker 499*7c568831SAndroid Build Coastguard Worker Note: This method does not free memory taken by the ns 500*7c568831SAndroid Build Coastguard Worker definitions. You will need to free it manually with the 501*7c568831SAndroid Build Coastguard Worker freeNsList() method on the returns xmlNs object. 502*7c568831SAndroid Build Coastguard Worker """ 503*7c568831SAndroid Build Coastguard Worker 504*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.xmlNodeRemoveNsDef(self._o, href) 505*7c568831SAndroid Build Coastguard Worker if ret is None:return None 506*7c568831SAndroid Build Coastguard Worker __tmp = xmlNs(_obj=ret) 507*7c568831SAndroid Build Coastguard Worker return __tmp 508*7c568831SAndroid Build Coastguard Worker 509*7c568831SAndroid Build Coastguard Worker # support for python2 iterators 510*7c568831SAndroid Build Coastguard Worker def walk_depth_first(self): 511*7c568831SAndroid Build Coastguard Worker return xmlCoreDepthFirstItertor(self) 512*7c568831SAndroid Build Coastguard Worker def walk_breadth_first(self): 513*7c568831SAndroid Build Coastguard Worker return xmlCoreBreadthFirstItertor(self) 514*7c568831SAndroid Build Coastguard Worker __iter__ = walk_depth_first 515*7c568831SAndroid Build Coastguard Worker 516*7c568831SAndroid Build Coastguard Worker def free(self): 517*7c568831SAndroid Build Coastguard Worker try: 518*7c568831SAndroid Build Coastguard Worker self.doc._ctxt.xpathFreeContext() 519*7c568831SAndroid Build Coastguard Worker except: 520*7c568831SAndroid Build Coastguard Worker pass 521*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlFreeDoc(self._o) 522*7c568831SAndroid Build Coastguard Worker 523*7c568831SAndroid Build Coastguard Worker 524*7c568831SAndroid Build Coastguard Worker# 525*7c568831SAndroid Build Coastguard Worker# implements the depth-first iterator for libxml2 DOM tree 526*7c568831SAndroid Build Coastguard Worker# 527*7c568831SAndroid Build Coastguard Workerclass xmlCoreDepthFirstItertor: 528*7c568831SAndroid Build Coastguard Worker def __init__(self, node): 529*7c568831SAndroid Build Coastguard Worker self.node = node 530*7c568831SAndroid Build Coastguard Worker self.parents = [] 531*7c568831SAndroid Build Coastguard Worker def __iter__(self): 532*7c568831SAndroid Build Coastguard Worker return self 533*7c568831SAndroid Build Coastguard Worker def __next__(self): 534*7c568831SAndroid Build Coastguard Worker while 1: 535*7c568831SAndroid Build Coastguard Worker if self.node: 536*7c568831SAndroid Build Coastguard Worker ret = self.node 537*7c568831SAndroid Build Coastguard Worker self.parents.append(self.node) 538*7c568831SAndroid Build Coastguard Worker self.node = self.node.children 539*7c568831SAndroid Build Coastguard Worker return ret 540*7c568831SAndroid Build Coastguard Worker try: 541*7c568831SAndroid Build Coastguard Worker parent = self.parents.pop() 542*7c568831SAndroid Build Coastguard Worker except IndexError: 543*7c568831SAndroid Build Coastguard Worker raise StopIteration 544*7c568831SAndroid Build Coastguard Worker self.node = parent.next 545*7c568831SAndroid Build Coastguard Worker next = __next__ 546*7c568831SAndroid Build Coastguard Worker 547*7c568831SAndroid Build Coastguard Worker# 548*7c568831SAndroid Build Coastguard Worker# implements the breadth-first iterator for libxml2 DOM tree 549*7c568831SAndroid Build Coastguard Worker# 550*7c568831SAndroid Build Coastguard Workerclass xmlCoreBreadthFirstItertor: 551*7c568831SAndroid Build Coastguard Worker def __init__(self, node): 552*7c568831SAndroid Build Coastguard Worker self.node = node 553*7c568831SAndroid Build Coastguard Worker self.parents = [] 554*7c568831SAndroid Build Coastguard Worker def __iter__(self): 555*7c568831SAndroid Build Coastguard Worker return self 556*7c568831SAndroid Build Coastguard Worker def __next__(self): 557*7c568831SAndroid Build Coastguard Worker while 1: 558*7c568831SAndroid Build Coastguard Worker if self.node: 559*7c568831SAndroid Build Coastguard Worker ret = self.node 560*7c568831SAndroid Build Coastguard Worker self.parents.append(self.node) 561*7c568831SAndroid Build Coastguard Worker self.node = self.node.next 562*7c568831SAndroid Build Coastguard Worker return ret 563*7c568831SAndroid Build Coastguard Worker try: 564*7c568831SAndroid Build Coastguard Worker parent = self.parents.pop() 565*7c568831SAndroid Build Coastguard Worker except IndexError: 566*7c568831SAndroid Build Coastguard Worker raise StopIteration 567*7c568831SAndroid Build Coastguard Worker self.node = parent.children 568*7c568831SAndroid Build Coastguard Worker next = __next__ 569*7c568831SAndroid Build Coastguard Worker 570*7c568831SAndroid Build Coastguard Worker# 571*7c568831SAndroid Build Coastguard Worker# converters to present a nicer view of the XPath returns 572*7c568831SAndroid Build Coastguard Worker# 573*7c568831SAndroid Build Coastguard Workerdef nodeWrap(o): 574*7c568831SAndroid Build Coastguard Worker # TODO try to cast to the most appropriate node class 575*7c568831SAndroid Build Coastguard Worker name = libxml2mod.type(o) 576*7c568831SAndroid Build Coastguard Worker if name == "element" or name == "text": 577*7c568831SAndroid Build Coastguard Worker return xmlNode(_obj=o) 578*7c568831SAndroid Build Coastguard Worker if name == "attribute": 579*7c568831SAndroid Build Coastguard Worker return xmlAttr(_obj=o) 580*7c568831SAndroid Build Coastguard Worker if name[0:8] == "document": 581*7c568831SAndroid Build Coastguard Worker return xmlDoc(_obj=o) 582*7c568831SAndroid Build Coastguard Worker if name == "namespace": 583*7c568831SAndroid Build Coastguard Worker return xmlNs(_obj=o) 584*7c568831SAndroid Build Coastguard Worker if name == "elem_decl": 585*7c568831SAndroid Build Coastguard Worker return xmlElement(_obj=o) 586*7c568831SAndroid Build Coastguard Worker if name == "attribute_decl": 587*7c568831SAndroid Build Coastguard Worker return xmlAttribute(_obj=o) 588*7c568831SAndroid Build Coastguard Worker if name == "entity_decl": 589*7c568831SAndroid Build Coastguard Worker return xmlEntity(_obj=o) 590*7c568831SAndroid Build Coastguard Worker if name == "dtd": 591*7c568831SAndroid Build Coastguard Worker return xmlDtd(_obj=o) 592*7c568831SAndroid Build Coastguard Worker return xmlNode(_obj=o) 593*7c568831SAndroid Build Coastguard Worker 594*7c568831SAndroid Build Coastguard Workerdef xpathObjectRet(o): 595*7c568831SAndroid Build Coastguard Worker otype = type(o) 596*7c568831SAndroid Build Coastguard Worker if otype == type([]): 597*7c568831SAndroid Build Coastguard Worker ret = list(map(xpathObjectRet, o)) 598*7c568831SAndroid Build Coastguard Worker return ret 599*7c568831SAndroid Build Coastguard Worker elif otype == type(()): 600*7c568831SAndroid Build Coastguard Worker ret = list(map(xpathObjectRet, o)) 601*7c568831SAndroid Build Coastguard Worker return tuple(ret) 602*7c568831SAndroid Build Coastguard Worker elif otype == type('') or otype == type(0) or otype == type(0.0): 603*7c568831SAndroid Build Coastguard Worker return o 604*7c568831SAndroid Build Coastguard Worker else: 605*7c568831SAndroid Build Coastguard Worker return nodeWrap(o) 606*7c568831SAndroid Build Coastguard Worker 607*7c568831SAndroid Build Coastguard Worker# 608*7c568831SAndroid Build Coastguard Worker# register an XPath function 609*7c568831SAndroid Build Coastguard Worker# 610*7c568831SAndroid Build Coastguard Workerdef registerXPathFunction(ctxt, name, ns_uri, f): 611*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.xmlRegisterXPathFunction(ctxt, name, ns_uri, f) 612*7c568831SAndroid Build Coastguard Worker 613*7c568831SAndroid Build Coastguard Worker# 614*7c568831SAndroid Build Coastguard Worker# For the xmlTextReader parser configuration 615*7c568831SAndroid Build Coastguard Worker# 616*7c568831SAndroid Build Coastguard WorkerPARSER_LOADDTD=1 617*7c568831SAndroid Build Coastguard WorkerPARSER_DEFAULTATTRS=2 618*7c568831SAndroid Build Coastguard WorkerPARSER_VALIDATE=3 619*7c568831SAndroid Build Coastguard WorkerPARSER_SUBST_ENTITIES=4 620*7c568831SAndroid Build Coastguard Worker 621*7c568831SAndroid Build Coastguard Worker# 622*7c568831SAndroid Build Coastguard Worker# For the error callback severities 623*7c568831SAndroid Build Coastguard Worker# 624*7c568831SAndroid Build Coastguard WorkerPARSER_SEVERITY_VALIDITY_WARNING=1 625*7c568831SAndroid Build Coastguard WorkerPARSER_SEVERITY_VALIDITY_ERROR=2 626*7c568831SAndroid Build Coastguard WorkerPARSER_SEVERITY_WARNING=3 627*7c568831SAndroid Build Coastguard WorkerPARSER_SEVERITY_ERROR=4 628*7c568831SAndroid Build Coastguard Worker 629*7c568831SAndroid Build Coastguard Worker# 630*7c568831SAndroid Build Coastguard Worker# register the libxml2 error handler 631*7c568831SAndroid Build Coastguard Worker# 632*7c568831SAndroid Build Coastguard Workerdef registerErrorHandler(f, ctx): 633*7c568831SAndroid Build Coastguard Worker """Register a Python written function to for error reporting. 634*7c568831SAndroid Build Coastguard Worker The function is called back as f(ctx, error). """ 635*7c568831SAndroid Build Coastguard Worker import sys 636*7c568831SAndroid Build Coastguard Worker if 'libxslt' not in sys.modules: 637*7c568831SAndroid Build Coastguard Worker # normal behaviour when libxslt is not imported 638*7c568831SAndroid Build Coastguard Worker ret = libxml2mod.xmlRegisterErrorHandler(f,ctx) 639*7c568831SAndroid Build Coastguard Worker else: 640*7c568831SAndroid Build Coastguard Worker # when libxslt is already imported, one must 641*7c568831SAndroid Build Coastguard Worker # use libxst's error handler instead 642*7c568831SAndroid Build Coastguard Worker import libxslt 643*7c568831SAndroid Build Coastguard Worker ret = libxslt.registerErrorHandler(f,ctx) 644*7c568831SAndroid Build Coastguard Worker return ret 645*7c568831SAndroid Build Coastguard Worker 646*7c568831SAndroid Build Coastguard Workerclass parserCtxtCore: 647*7c568831SAndroid Build Coastguard Worker 648*7c568831SAndroid Build Coastguard Worker def __init__(self, _obj=None): 649*7c568831SAndroid Build Coastguard Worker if _obj != None: 650*7c568831SAndroid Build Coastguard Worker self._o = _obj; 651*7c568831SAndroid Build Coastguard Worker return 652*7c568831SAndroid Build Coastguard Worker self._o = None 653*7c568831SAndroid Build Coastguard Worker 654*7c568831SAndroid Build Coastguard Worker def __del__(self): 655*7c568831SAndroid Build Coastguard Worker if self._o != None: 656*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlFreeParserCtxt(self._o) 657*7c568831SAndroid Build Coastguard Worker self._o = None 658*7c568831SAndroid Build Coastguard Worker 659*7c568831SAndroid Build Coastguard Worker def setErrorHandler(self,f,arg): 660*7c568831SAndroid Build Coastguard Worker """Register an error handler that will be called back as 661*7c568831SAndroid Build Coastguard Worker f(arg,msg,severity,reserved). 662*7c568831SAndroid Build Coastguard Worker 663*7c568831SAndroid Build Coastguard Worker @reserved is currently always None.""" 664*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlParserCtxtSetErrorHandler(self._o,f,arg) 665*7c568831SAndroid Build Coastguard Worker 666*7c568831SAndroid Build Coastguard Worker def getErrorHandler(self): 667*7c568831SAndroid Build Coastguard Worker """Return (f,arg) as previously registered with setErrorHandler 668*7c568831SAndroid Build Coastguard Worker or (None,None).""" 669*7c568831SAndroid Build Coastguard Worker return libxml2mod.xmlParserCtxtGetErrorHandler(self._o) 670*7c568831SAndroid Build Coastguard Worker 671*7c568831SAndroid Build Coastguard Worker def addLocalCatalog(self, uri): 672*7c568831SAndroid Build Coastguard Worker """Register a local catalog with the parser""" 673*7c568831SAndroid Build Coastguard Worker return libxml2mod.addLocalCatalog(self._o, uri) 674*7c568831SAndroid Build Coastguard Worker 675*7c568831SAndroid Build Coastguard Worker 676*7c568831SAndroid Build Coastguard Workerclass ValidCtxtCore: 677*7c568831SAndroid Build Coastguard Worker 678*7c568831SAndroid Build Coastguard Worker def __init__(self, *args, **kw): 679*7c568831SAndroid Build Coastguard Worker pass 680*7c568831SAndroid Build Coastguard Worker 681*7c568831SAndroid Build Coastguard Worker def setValidityErrorHandler(self, err_func, warn_func, arg=None): 682*7c568831SAndroid Build Coastguard Worker """ 683*7c568831SAndroid Build Coastguard Worker Register error and warning handlers for DTD validation. 684*7c568831SAndroid Build Coastguard Worker These will be called back as f(msg,arg) 685*7c568831SAndroid Build Coastguard Worker """ 686*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlSetValidErrors(self._o, err_func, warn_func, arg) 687*7c568831SAndroid Build Coastguard Worker 688*7c568831SAndroid Build Coastguard Worker 689*7c568831SAndroid Build Coastguard Workerclass SchemaValidCtxtCore: 690*7c568831SAndroid Build Coastguard Worker 691*7c568831SAndroid Build Coastguard Worker def __init__(self, *args, **kw): 692*7c568831SAndroid Build Coastguard Worker pass 693*7c568831SAndroid Build Coastguard Worker 694*7c568831SAndroid Build Coastguard Worker def setValidityErrorHandler(self, err_func, warn_func, arg=None): 695*7c568831SAndroid Build Coastguard Worker """ 696*7c568831SAndroid Build Coastguard Worker Register error and warning handlers for Schema validation. 697*7c568831SAndroid Build Coastguard Worker These will be called back as f(msg,arg) 698*7c568831SAndroid Build Coastguard Worker """ 699*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlSchemaSetValidErrors(self._o, err_func, warn_func, arg) 700*7c568831SAndroid Build Coastguard Worker 701*7c568831SAndroid Build Coastguard Worker 702*7c568831SAndroid Build Coastguard Workerclass relaxNgValidCtxtCore: 703*7c568831SAndroid Build Coastguard Worker 704*7c568831SAndroid Build Coastguard Worker def __init__(self, *args, **kw): 705*7c568831SAndroid Build Coastguard Worker pass 706*7c568831SAndroid Build Coastguard Worker 707*7c568831SAndroid Build Coastguard Worker def setValidityErrorHandler(self, err_func, warn_func, arg=None): 708*7c568831SAndroid Build Coastguard Worker """ 709*7c568831SAndroid Build Coastguard Worker Register error and warning handlers for RelaxNG validation. 710*7c568831SAndroid Build Coastguard Worker These will be called back as f(msg,arg) 711*7c568831SAndroid Build Coastguard Worker """ 712*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlRelaxNGSetValidErrors(self._o, err_func, warn_func, arg) 713*7c568831SAndroid Build Coastguard Worker 714*7c568831SAndroid Build Coastguard Worker 715*7c568831SAndroid Build Coastguard Workerdef _xmlTextReaderErrorFunc(xxx_todo_changeme,msg,severity,locator): 716*7c568831SAndroid Build Coastguard Worker """Intermediate callback to wrap the locator""" 717*7c568831SAndroid Build Coastguard Worker (f,arg) = xxx_todo_changeme 718*7c568831SAndroid Build Coastguard Worker return f(arg,msg,severity,xmlTextReaderLocator(locator)) 719*7c568831SAndroid Build Coastguard Worker 720*7c568831SAndroid Build Coastguard Workerclass xmlTextReaderCore: 721*7c568831SAndroid Build Coastguard Worker 722*7c568831SAndroid Build Coastguard Worker def __init__(self, _obj=None): 723*7c568831SAndroid Build Coastguard Worker self.input = None 724*7c568831SAndroid Build Coastguard Worker if _obj != None:self._o = _obj;return 725*7c568831SAndroid Build Coastguard Worker self._o = None 726*7c568831SAndroid Build Coastguard Worker 727*7c568831SAndroid Build Coastguard Worker def __del__(self): 728*7c568831SAndroid Build Coastguard Worker if self._o != None: 729*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlFreeTextReader(self._o) 730*7c568831SAndroid Build Coastguard Worker self._o = None 731*7c568831SAndroid Build Coastguard Worker 732*7c568831SAndroid Build Coastguard Worker def SetErrorHandler(self,f,arg): 733*7c568831SAndroid Build Coastguard Worker """Register an error handler that will be called back as 734*7c568831SAndroid Build Coastguard Worker f(arg,msg,severity,locator).""" 735*7c568831SAndroid Build Coastguard Worker if f is None: 736*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlTextReaderSetErrorHandler(\ 737*7c568831SAndroid Build Coastguard Worker self._o,None,None) 738*7c568831SAndroid Build Coastguard Worker else: 739*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlTextReaderSetErrorHandler(\ 740*7c568831SAndroid Build Coastguard Worker self._o,_xmlTextReaderErrorFunc,(f,arg)) 741*7c568831SAndroid Build Coastguard Worker 742*7c568831SAndroid Build Coastguard Worker def GetErrorHandler(self): 743*7c568831SAndroid Build Coastguard Worker """Return (f,arg) as previously registered with setErrorHandler 744*7c568831SAndroid Build Coastguard Worker or (None,None).""" 745*7c568831SAndroid Build Coastguard Worker f,arg = libxml2mod.xmlTextReaderGetErrorHandler(self._o) 746*7c568831SAndroid Build Coastguard Worker if f is None: 747*7c568831SAndroid Build Coastguard Worker return None,None 748*7c568831SAndroid Build Coastguard Worker else: 749*7c568831SAndroid Build Coastguard Worker # assert f is _xmlTextReaderErrorFunc 750*7c568831SAndroid Build Coastguard Worker return arg 751*7c568831SAndroid Build Coastguard Worker 752*7c568831SAndroid Build Coastguard Worker# 753*7c568831SAndroid Build Coastguard Worker# The cleanup now goes though a wrapper in libxml.c 754*7c568831SAndroid Build Coastguard Worker# 755*7c568831SAndroid Build Coastguard Workerdef cleanupParser(): 756*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlPythonCleanupParser() 757*7c568831SAndroid Build Coastguard Worker 758*7c568831SAndroid Build Coastguard Worker# 759*7c568831SAndroid Build Coastguard Worker# The interface to xmlRegisterInputCallbacks. 760*7c568831SAndroid Build Coastguard Worker# Since this API does not allow to pass a data object along with 761*7c568831SAndroid Build Coastguard Worker# match/open callbacks, it is necessary to maintain a list of all 762*7c568831SAndroid Build Coastguard Worker# Python callbacks. 763*7c568831SAndroid Build Coastguard Worker# 764*7c568831SAndroid Build Coastguard Worker__input_callbacks = [] 765*7c568831SAndroid Build Coastguard Workerdef registerInputCallback(func): 766*7c568831SAndroid Build Coastguard Worker def findOpenCallback(URI): 767*7c568831SAndroid Build Coastguard Worker for cb in reversed(__input_callbacks): 768*7c568831SAndroid Build Coastguard Worker o = cb(URI) 769*7c568831SAndroid Build Coastguard Worker if o is not None: 770*7c568831SAndroid Build Coastguard Worker return o 771*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlRegisterInputCallback(findOpenCallback) 772*7c568831SAndroid Build Coastguard Worker __input_callbacks.append(func) 773*7c568831SAndroid Build Coastguard Worker 774*7c568831SAndroid Build Coastguard Workerdef popInputCallbacks(): 775*7c568831SAndroid Build Coastguard Worker # First pop python-level callbacks, when no more available - start 776*7c568831SAndroid Build Coastguard Worker # popping built-in ones. 777*7c568831SAndroid Build Coastguard Worker if len(__input_callbacks) > 0: 778*7c568831SAndroid Build Coastguard Worker __input_callbacks.pop() 779*7c568831SAndroid Build Coastguard Worker if len(__input_callbacks) == 0: 780*7c568831SAndroid Build Coastguard Worker libxml2mod.xmlUnregisterInputCallback() 781*7c568831SAndroid Build Coastguard Worker 782*7c568831SAndroid Build Coastguard Worker# 783*7c568831SAndroid Build Coastguard Worker# Deprecated 784*7c568831SAndroid Build Coastguard Worker# 785*7c568831SAndroid Build Coastguard Workerdef dumpMemory(): 786*7c568831SAndroid Build Coastguard Worker """DEPRECATED: This feature was removed.""" 787*7c568831SAndroid Build Coastguard Worker 788*7c568831SAndroid Build Coastguard Worker# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 789*7c568831SAndroid Build Coastguard Worker# 790*7c568831SAndroid Build Coastguard Worker# Everything before this line comes from libxml.py 791*7c568831SAndroid Build Coastguard Worker# Everything after this line is automatically generated 792*7c568831SAndroid Build Coastguard Worker# 793*7c568831SAndroid Build Coastguard Worker# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 794*7c568831SAndroid Build Coastguard Worker 795