15e5c2d0a93e3e1bef0aaa63500cbbbd53e6a4063Daniel Veillardimport libxml2mod 285bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillardimport types 33b6acc93bf03bae282c71d4f63a9639b1bb7dc38Daniel Veillardimport sys 4d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 5a81355ef66bbbda49987309b748e5681075695edDaniel Veillard# The root of all libxml2 errors. 6a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass libxmlError(Exception): pass 7a81355ef66bbbda49987309b748e5681075695edDaniel Veillard 86f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard# Type of the wrapper class for the C objects wrappers 96f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillarddef checkWrapper(obj): 106f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard try: 116f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard n = type(_obj).__name__ 126f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard if n != 'PyCObject' and n != 'PyCapsule': 136f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard return 1 146f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard except: 156f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard return 0 166f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard return 0 176f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard 181971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# 193b6acc93bf03bae282c71d4f63a9639b1bb7dc38Daniel Veillard# id() is sometimes negative ... 203b6acc93bf03bae282c71d4f63a9639b1bb7dc38Daniel Veillard# 213b6acc93bf03bae282c71d4f63a9639b1bb7dc38Daniel Veillarddef pos_id(o): 223b6acc93bf03bae282c71d4f63a9639b1bb7dc38Daniel Veillard i = id(o) 233b6acc93bf03bae282c71d4f63a9639b1bb7dc38Daniel Veillard if (i < 0): 243cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard return (sys.maxsize - i) 253b6acc93bf03bae282c71d4f63a9639b1bb7dc38Daniel Veillard return i 263b6acc93bf03bae282c71d4f63a9639b1bb7dc38Daniel Veillard 273b6acc93bf03bae282c71d4f63a9639b1bb7dc38Daniel Veillard# 288d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# Errors raised by the wrappers when some tree handling failed. 298d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# 30a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass treeError(libxmlError): 318d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __init__(self, msg): 328d24cc189845663509623fbd6b5106cc01266994Daniel Veillard self.msg = msg 338d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __str__(self): 348d24cc189845663509623fbd6b5106cc01266994Daniel Veillard return self.msg 358d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 36a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass parserError(libxmlError): 378d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __init__(self, msg): 388d24cc189845663509623fbd6b5106cc01266994Daniel Veillard self.msg = msg 398d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __str__(self): 408d24cc189845663509623fbd6b5106cc01266994Daniel Veillard return self.msg 418d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 42a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass uriError(libxmlError): 438d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __init__(self, msg): 448d24cc189845663509623fbd6b5106cc01266994Daniel Veillard self.msg = msg 458d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __str__(self): 468d24cc189845663509623fbd6b5106cc01266994Daniel Veillard return self.msg 478d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 48a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass xpathError(libxmlError): 498d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __init__(self, msg): 508d24cc189845663509623fbd6b5106cc01266994Daniel Veillard self.msg = msg 518d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __str__(self): 528d24cc189845663509623fbd6b5106cc01266994Daniel Veillard return self.msg 538d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 54c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardclass ioWrapper: 55c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __init__(self, _obj): 56c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self.__io = _obj 57c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 58c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 59c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def io_close(self): 60c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self.__io == None: 611d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(-1) 621d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack self.__io.close() 631d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack self.__io = None 641d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(0) 65c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 66c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def io_flush(self): 67c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self.__io == None: 681d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(-1) 691d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack self.__io.flush() 701d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(0) 71c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 72c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def io_read(self, len = -1): 73c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self.__io == None: 741d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(-1) 756f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard try: 766f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard if len < 0: 776f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard ret = self.__io.read() 786f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard else: 796f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard ret = self.__io.read(len) 80bf4a8f0ea8579f05eea2e6f43df73b2a239d41b3Daniel Veillard except Exception: 81bf4a8f0ea8579f05eea2e6f43df73b2a239d41b3Daniel Veillard import sys 82bf4a8f0ea8579f05eea2e6f43df73b2a239d41b3Daniel Veillard e = sys.exc_info()[1] 836f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard print("failed to read from Python:", type(e)) 846f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard print("on IO:", self.__io) 856f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard self.__io == None 866f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard return(-1) 876f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard 886f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard return(ret) 89c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 90c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def io_write(self, str, len = -1): 91c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self.__io == None: 921d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(-1) 93c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if len < 0: 941d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(self.__io.write(str)) 951d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(self.__io.write(str, len)) 96c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 97c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardclass ioReadWrapper(ioWrapper): 98c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __init__(self, _obj, enc = ""): 99c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ioWrapper.__init__(self, _obj) 100c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = libxml2mod.xmlCreateInputBuffer(self, enc) 101c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 102c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __del__(self): 1033cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard print("__del__") 104c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self.io_close() 105c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self._o != None: 106c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard libxml2mod.xmlFreeParserInputBuffer(self._o) 107c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 108c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 109c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def close(self): 110c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self.io_close() 111c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self._o != None: 112c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard libxml2mod.xmlFreeParserInputBuffer(self._o) 113c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 114c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 115c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardclass ioWriteWrapper(ioWrapper): 116c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __init__(self, _obj, enc = ""): 11785bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard# print "ioWriteWrapper.__init__", _obj 11885bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard if type(_obj) == type(''): 1193cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard print("write io from a string") 12037e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack self.o = None 1216f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard elif type(_obj).__name__ == 'PyCapsule': 1226f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard file = libxml2mod.outputBufferGetPythonFile(_obj) 1236f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard if file != None: 1246f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard ioWrapper.__init__(self, file) 1256f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard else: 1266f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard ioWrapper.__init__(self, _obj) 1276f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard self._o = _obj 1286f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard# elif type(_obj) == types.InstanceType: 1296f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard# print(("write io from instance of %s" % (_obj.__class__))) 1306f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard# ioWrapper.__init__(self, _obj) 1316f18465189dbfdf6efb1e6580243918a4f609d1cDaniel Veillard# self._o = libxml2mod.xmlCreateOutputBuffer(self, enc) 13237e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack else: 13337e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack file = libxml2mod.outputBufferGetPythonFile(_obj) 13437e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack if file != None: 13537e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack ioWrapper.__init__(self, file) 13637e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack else: 13737e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack ioWrapper.__init__(self, _obj) 13837e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack self._o = _obj 139c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 140c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __del__(self): 14185bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard# print "__del__" 142c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self.io_close() 143c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self._o != None: 144c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard libxml2mod.xmlOutputBufferClose(self._o) 145c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 146c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 14785bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard def flush(self): 14885bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard self.io_flush() 14985bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard if self._o != None: 15085bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard libxml2mod.xmlOutputBufferClose(self._o) 15185bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard self._o = None 15285bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard 153c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def close(self): 15485bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard self.io_flush() 155c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self._o != None: 156c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard libxml2mod.xmlOutputBufferClose(self._o) 157c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 158c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 1598d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# 1608d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# Example of a class to handle SAX events 1618d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# 1628d24cc189845663509623fbd6b5106cc01266994Daniel Veillardclass SAXCallback: 1638d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """Base class for SAX handlers""" 1648d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def startDocument(self): 1658d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called at the start of the document""" 1668d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1678d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1688d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def endDocument(self): 1698d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called at the end of the document""" 1708d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1718d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1728d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def startElement(self, tag, attrs): 1738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called at the start of every element, tag is the name of 1741d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack the element, attrs is a dictionary of the element's attributes""" 1758d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1768d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1778d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def endElement(self, tag): 1788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called at the start of every element, tag is the name of 1791d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack the element""" 1808d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1818d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1828d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def characters(self, data): 1838d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when character data have been read, data is the string 1841d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack containing the data, multiple consecutive characters() callback 1851d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack are possible.""" 1868d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1878d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1888d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def cdataBlock(self, data): 1898d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when CDATA section have been read, data is the string 1901d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack containing the data, multiple consecutive cdataBlock() callback 1911d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack are possible.""" 1928d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1938d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1948d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def reference(self, name): 1958d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an entity reference has been found""" 1968d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1978d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1988d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def ignorableWhitespace(self, data): 1998d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when potentially ignorable white spaces have been found""" 2008d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 2018d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2028d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def processingInstruction(self, target, data): 2038d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when a PI has been found, target contains the PI name and 2041d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack data is the associated data in the PI""" 2058d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 2068d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2078d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def comment(self, content): 2088d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when a comment has been found, content contains the comment""" 2098d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 2108d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def externalSubset(self, name, externalID, systemID): 2128d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when a DOCTYPE declaration has been found, name is the 2131d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack DTD name and externalID, systemID are the DTD public and system 2141d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack identifier for that DTd if available""" 2158d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 2168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2178d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def internalSubset(self, name, externalID, systemID): 2188d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when a DOCTYPE declaration has been found, name is the 2191d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack DTD name and externalID, systemID are the DTD public and system 2201d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack identifier for that DTD if available""" 2218d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 2228d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2238d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def entityDecl(self, name, type, externalID, systemID, content): 2248d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an ENTITY declaration has been found, name is the 2251d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack entity name and externalID, systemID are the entity public and 2261d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack system identifier for that entity if available, type indicates 2271d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack the entity type, and content reports it's string content""" 2288d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 2298d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2308d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def notationDecl(self, name, externalID, systemID): 2318d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an NOTATION declaration has been found, name is the 2321d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack notation name and externalID, systemID are the notation public and 2331d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack system identifier for that notation if available""" 2348d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 2358d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2368d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def attributeDecl(self, elem, name, type, defi, defaultValue, nameList): 2378d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an ATTRIBUTE definition has been found""" 2381d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack pass 2398d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2408d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def elementDecl(self, name, type, content): 2418d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an ELEMENT definition has been found""" 2421d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack pass 2438d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2448d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def entityDecl(self, name, publicId, systemID, notationName): 2458d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an unparsed ENTITY declaration has been found, 2461d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack name is the entity name and publicId,, systemID are the entity 2471d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack public and system identifier for that entity if available, 2481d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack and notationName indicate the associated NOTATION""" 2498d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 2508d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2518d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def warning(self, msg): 252eaccdc6554d90d6a29a3674d444710a7c0933f41Daniel Veillard #print msg 253745648bca870c869016d4cb323f29424e83b1bcdDaniel Veillard pass 2548d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2558d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def error(self, msg): 2568d24cc189845663509623fbd6b5106cc01266994Daniel Veillard raise parserError(msg) 2578d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2588d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def fatalError(self, msg): 2598d24cc189845663509623fbd6b5106cc01266994Daniel Veillard raise parserError(msg) 2608d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2618d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# 2621971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# This class is the ancestor of all the Node classes. It provides 2631971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# the basic functionalities shared by all nodes (and handle 2641971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# gracefylly the exception), like name, navigation in the tree, 2651e77438da7dd912885effa97b1079867d1e041beDaniel Veillard# doc reference, content access and serializing to a string or URI 2661971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# 26736ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillardclass xmlCore: 268d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def __init__(self, _obj=None): 269d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if _obj != None: 27001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard self._o = _obj; 27101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return 27201a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard self._o = None 27340cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 27440cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack def __eq__(self, other): 27540cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack if other == None: 2767a12e57b7f4ff2f1bc94a8942fdb1224a6d4deaeWilliam M. Brack return False 27740cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack ret = libxml2mod.compareNodesEqual(self._o, other._o) 2787a12e57b7f4ff2f1bc94a8942fdb1224a6d4deaeWilliam M. Brack if ret == None: 2797a12e57b7f4ff2f1bc94a8942fdb1224a6d4deaeWilliam M. Brack return False 2807a12e57b7f4ff2f1bc94a8942fdb1224a6d4deaeWilliam M. Brack return ret == True 28140cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack def __ne__(self, other): 28240cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack if other == None: 2837a12e57b7f4ff2f1bc94a8942fdb1224a6d4deaeWilliam M. Brack return True 28440cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack ret = libxml2mod.compareNodesEqual(self._o, other._o) 2857a12e57b7f4ff2f1bc94a8942fdb1224a6d4deaeWilliam M. Brack return not ret 28640cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack def __hash__(self): 2877a12e57b7f4ff2f1bc94a8942fdb1224a6d4deaeWilliam M. Brack ret = libxml2mod.nodeHash(self._o) 2887a12e57b7f4ff2f1bc94a8942fdb1224a6d4deaeWilliam M. Brack return ret 28940cca61fc130f0f865f51b2fb2ba15e478e102abWilliam M. Brack 2901cd4dae166d934a18ebcb18a69700271572bcd81Daniel Veillard def __str__(self): 2911cd4dae166d934a18ebcb18a69700271572bcd81Daniel Veillard return self.serialize() 292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_parent(self): 29301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.parent(self._o) 29401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 29501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 296e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 297d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_children(self): 29801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.children(self._o) 29901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 30001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 301e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 302d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_last(self): 30301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.last(self._o) 30401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 30501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 306e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 307d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_next(self): 30801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.next(self._o) 30901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 31001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 311e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 3121971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard def get_properties(self): 31301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.properties(self._o) 31401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 31501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 31601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return xmlAttr(_obj=ret) 317d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_prev(self): 31801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.prev(self._o) 31901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 32001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 321e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 322d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_content(self): 32301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return libxml2mod.xmlNodeGetContent(self._o) 32451a447a57832da998689f81e062860b094fe922bDaniel Veillard getContent = get_content # why is this duplicate naming needed ? 325d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_name(self): 32601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return libxml2mod.name(self._o) 327d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_type(self): 32801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return libxml2mod.type(self._o) 32951a447a57832da998689f81e062860b094fe922bDaniel Veillard def get_doc(self): 33051a447a57832da998689f81e062860b094fe922bDaniel Veillard ret = libxml2mod.doc(self._o) 33151a447a57832da998689f81e062860b094fe922bDaniel Veillard if ret == None: 33251a447a57832da998689f81e062860b094fe922bDaniel Veillard if self.type in ["document_xml", "document_html"]: 33351a447a57832da998689f81e062860b094fe922bDaniel Veillard return xmlDoc(_obj=self._o) 33451a447a57832da998689f81e062860b094fe922bDaniel Veillard else: 33551a447a57832da998689f81e062860b094fe922bDaniel Veillard return None 33651a447a57832da998689f81e062860b094fe922bDaniel Veillard return xmlDoc(_obj=ret) 33751a447a57832da998689f81e062860b094fe922bDaniel Veillard # 33851a447a57832da998689f81e062860b094fe922bDaniel Veillard # Those are common attributes to nearly all type of nodes 33951a447a57832da998689f81e062860b094fe922bDaniel Veillard # defined as python2 properties 34051a447a57832da998689f81e062860b094fe922bDaniel Veillard # 34151a447a57832da998689f81e062860b094fe922bDaniel Veillard import sys 34251a447a57832da998689f81e062860b094fe922bDaniel Veillard if float(sys.version[0:3]) < 2.2: 3431d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack def __getattr__(self, attr): 3441d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if attr == "parent": 3451d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.parent(self._o) 3461d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3471d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 348e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 3491d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "properties": 3501d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.properties(self._o) 3511d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3521d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 3531d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlAttr(_obj=ret) 3541d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "children": 3551d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.children(self._o) 3561d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3571d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 358e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 3591d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "last": 3601d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.last(self._o) 3611d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3621d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 363e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 3641d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "next": 3651d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.next(self._o) 3661d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3671d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 368e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 3691d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "prev": 3701d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.prev(self._o) 3711d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3721d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 373e32ceb93f425ee852021ccda157fca923a1046b0Alexey Neyman return nodeWrap(ret) 3741d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "content": 3751d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return libxml2mod.xmlNodeGetContent(self._o) 3761d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "name": 3771d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return libxml2mod.name(self._o) 3781d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "type": 3791d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return libxml2mod.type(self._o) 3801d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "doc": 3811d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.doc(self._o) 3821d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3831d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if self.type == "document_xml" or self.type == "document_html": 3841d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlDoc(_obj=self._o) 3851d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack else: 3861d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 3871d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlDoc(_obj=ret) 3883cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard raise AttributeError(attr) 38951a447a57832da998689f81e062860b094fe922bDaniel Veillard else: 3901d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack parent = property(get_parent, None, None, "Parent node") 3911d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack children = property(get_children, None, None, "First child node") 3921d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack last = property(get_last, None, None, "Last sibling node") 3931d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack next = property(get_next, None, None, "Next sibling node") 3941d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack prev = property(get_prev, None, None, "Previous sibling node") 3951d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack properties = property(get_properties, None, None, "List of properies") 3961d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack content = property(get_content, None, None, "Content of this node") 3971d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack name = property(get_name, None, None, "Node name") 3981d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack type = property(get_type, None, None, "Node type") 3991d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack doc = property(get_doc, None, None, "The document this node belongs to") 4001e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 4011e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # 4021e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # Serialization routines, the optional arguments have the following 4031e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # meaning: 4041e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # encoding: string to ask saving in a specific encoding 40551a447a57832da998689f81e062860b094fe922bDaniel Veillard # indent: if 1 the serializer is asked to indent the output 4061e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # 4071e77438da7dd912885effa97b1079867d1e041beDaniel Veillard def serialize(self, encoding = None, format = 0): 4081e77438da7dd912885effa97b1079867d1e041beDaniel Veillard return libxml2mod.serializeNode(self._o, encoding, format) 4091e77438da7dd912885effa97b1079867d1e041beDaniel Veillard def saveTo(self, file, encoding = None, format = 0): 4101e77438da7dd912885effa97b1079867d1e041beDaniel Veillard return libxml2mod.saveNodeTo(self._o, file, encoding, format) 41101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard 412f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard # 413d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # Canonicalization routines: 414d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # 415d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # nodes: the node set (tuple or list) to be included in the 416d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # canonized image or None if all document nodes should be 417d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # included. 418d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # exclusive: the exclusive flag (0 - non-exclusive 419d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # canonicalization; otherwise - exclusive canonicalization) 420d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # prefixes: the list of inclusive namespace prefixes (strings), 421d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # or None if there is no inclusive namespaces (only for 422d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # exclusive canonicalization, ignored otherwise) 423d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # with_comments: include comments in the result (!=0) or not 424d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # (==0) 425d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard def c14nMemory(self, 426d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes=None, 427d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive=0, 428d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes=None, 429d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments=0): 430d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if nodes: 4313cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard nodes = [n._o for n in nodes] 432d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return libxml2mod.xmlC14NDocDumpMemory( 433d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard self.get_doc()._o, 434d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes, 435d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive != 0, 436d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes, 437d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments != 0) 438d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard def c14nSaveTo(self, 439d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard file, 440d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes=None, 441d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive=0, 442d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes=None, 443d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments=0): 444d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if nodes: 4453cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard nodes = [n._o for n in nodes] 446d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return libxml2mod.xmlC14NDocSaveTo( 447d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard self.get_doc()._o, 448d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes, 449d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive != 0, 450d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes, 451d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments != 0, 452d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard file) 453d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 454d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # 455f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard # Selecting nodes using XPath, a bit slow because the context 456f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard # is allocated/freed every time but convenient. 457f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard # 458f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard def xpathEval(self, expr): 4591d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack doc = self.doc 4601d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if doc == None: 4611d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 4621d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ctxt = doc.xpathNewContext() 4631d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ctxt.setContextNode(self) 4641d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack res = ctxt.xpathEval(expr) 4651d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ctxt.xpathFreeContext() 4661d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return res 46751a447a57832da998689f81e062860b094fe922bDaniel Veillard 468f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # 469f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # Selecting nodes using XPath, faster because the context 470f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # is allocated just once per xmlDoc. 471f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # 472f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # Removed: DV memleaks c.f. #126735 473f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # 474f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# def xpathEval2(self, expr): 475f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# doc = self.doc 476f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# if doc == None: 477f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# return None 478f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# try: 479f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# doc._ctxt.setContextNode(self) 480f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# except: 481f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# doc._ctxt = doc.xpathNewContext() 482f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# doc._ctxt.setContextNode(self) 483f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# res = doc._ctxt.xpathEval(expr) 484f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# return res 48551a447a57832da998689f81e062860b094fe922bDaniel Veillard def xpathEval2(self, expr): 486f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard return self.xpathEval(expr) 48751a447a57832da998689f81e062860b094fe922bDaniel Veillard 488f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard # Remove namespaces 489f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard def removeNsDef(self, href): 490f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard """ 491f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard Remove a namespace definition from a node. If href is None, 492f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard remove all of the ns definitions on that node. The removed 493f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard namespaces are returned as a linked list. 494f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 495f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard Note: If any child nodes referred to the removed namespaces, 496f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard they will be left with dangling links. You should call 497147687f1086cb5c046bd916a27c15ef6d449f293Leonid Evdokimov renconciliateNs() to fix those pointers. 498f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 499f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard Note: This method does not free memory taken by the ns 500f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard definitions. You will need to free it manually with the 501f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard freeNsList() method on the returns xmlNs object. 502f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard """ 503f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 504f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard ret = libxml2mod.xmlNodeRemoveNsDef(self._o, href) 505f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard if ret is None:return None 506f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard __tmp = xmlNs(_obj=ret) 507f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard return __tmp 508f9cf6f5a01527406ed0bcbcf5a180d85b5e771deDaniel Veillard 50951a447a57832da998689f81e062860b094fe922bDaniel Veillard # support for python2 iterators 51051a447a57832da998689f81e062860b094fe922bDaniel Veillard def walk_depth_first(self): 51151a447a57832da998689f81e062860b094fe922bDaniel Veillard return xmlCoreDepthFirstItertor(self) 51251a447a57832da998689f81e062860b094fe922bDaniel Veillard def walk_breadth_first(self): 51351a447a57832da998689f81e062860b094fe922bDaniel Veillard return xmlCoreBreadthFirstItertor(self) 51451a447a57832da998689f81e062860b094fe922bDaniel Veillard __iter__ = walk_depth_first 51551a447a57832da998689f81e062860b094fe922bDaniel Veillard 51651a447a57832da998689f81e062860b094fe922bDaniel Veillard def free(self): 51751a447a57832da998689f81e062860b094fe922bDaniel Veillard try: 51851a447a57832da998689f81e062860b094fe922bDaniel Veillard self.doc._ctxt.xpathFreeContext() 51951a447a57832da998689f81e062860b094fe922bDaniel Veillard except: 52051a447a57832da998689f81e062860b094fe922bDaniel Veillard pass 521f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard libxml2mod.xmlFreeDoc(self._o) 52251a447a57832da998689f81e062860b094fe922bDaniel Veillard 52351a447a57832da998689f81e062860b094fe922bDaniel Veillard 52451a447a57832da998689f81e062860b094fe922bDaniel Veillard# 52551a447a57832da998689f81e062860b094fe922bDaniel Veillard# implements the depth-first iterator for libxml2 DOM tree 52651a447a57832da998689f81e062860b094fe922bDaniel Veillard# 52751a447a57832da998689f81e062860b094fe922bDaniel Veillardclass xmlCoreDepthFirstItertor: 52851a447a57832da998689f81e062860b094fe922bDaniel Veillard def __init__(self, node): 52951a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = node 53051a447a57832da998689f81e062860b094fe922bDaniel Veillard self.parents = [] 53151a447a57832da998689f81e062860b094fe922bDaniel Veillard def __iter__(self): 53251a447a57832da998689f81e062860b094fe922bDaniel Veillard return self 533b3e488b0d90d5b0dbebf02cbd20894367f728d3eRon Angeles def __next__(self): 53451a447a57832da998689f81e062860b094fe922bDaniel Veillard while 1: 53551a447a57832da998689f81e062860b094fe922bDaniel Veillard if self.node: 53651a447a57832da998689f81e062860b094fe922bDaniel Veillard ret = self.node 53751a447a57832da998689f81e062860b094fe922bDaniel Veillard self.parents.append(self.node) 53851a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = self.node.children 53951a447a57832da998689f81e062860b094fe922bDaniel Veillard return ret 54051a447a57832da998689f81e062860b094fe922bDaniel Veillard try: 54151a447a57832da998689f81e062860b094fe922bDaniel Veillard parent = self.parents.pop() 54251a447a57832da998689f81e062860b094fe922bDaniel Veillard except IndexError: 54351a447a57832da998689f81e062860b094fe922bDaniel Veillard raise StopIteration 54487f3287d9b00bdc39be032a8a3f2d46860eaf787Daniel Veillard self.node = parent.next 545b3e488b0d90d5b0dbebf02cbd20894367f728d3eRon Angeles next = __next__ 54651a447a57832da998689f81e062860b094fe922bDaniel Veillard 54751a447a57832da998689f81e062860b094fe922bDaniel Veillard# 54851a447a57832da998689f81e062860b094fe922bDaniel Veillard# implements the breadth-first iterator for libxml2 DOM tree 54951a447a57832da998689f81e062860b094fe922bDaniel Veillard# 55051a447a57832da998689f81e062860b094fe922bDaniel Veillardclass xmlCoreBreadthFirstItertor: 55151a447a57832da998689f81e062860b094fe922bDaniel Veillard def __init__(self, node): 55251a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = node 55351a447a57832da998689f81e062860b094fe922bDaniel Veillard self.parents = [] 55451a447a57832da998689f81e062860b094fe922bDaniel Veillard def __iter__(self): 55551a447a57832da998689f81e062860b094fe922bDaniel Veillard return self 556b3e488b0d90d5b0dbebf02cbd20894367f728d3eRon Angeles def __next__(self): 55751a447a57832da998689f81e062860b094fe922bDaniel Veillard while 1: 55851a447a57832da998689f81e062860b094fe922bDaniel Veillard if self.node: 55951a447a57832da998689f81e062860b094fe922bDaniel Veillard ret = self.node 56051a447a57832da998689f81e062860b094fe922bDaniel Veillard self.parents.append(self.node) 56187f3287d9b00bdc39be032a8a3f2d46860eaf787Daniel Veillard self.node = self.node.next 56251a447a57832da998689f81e062860b094fe922bDaniel Veillard return ret 56351a447a57832da998689f81e062860b094fe922bDaniel Veillard try: 56451a447a57832da998689f81e062860b094fe922bDaniel Veillard parent = self.parents.pop() 56551a447a57832da998689f81e062860b094fe922bDaniel Veillard except IndexError: 56651a447a57832da998689f81e062860b094fe922bDaniel Veillard raise StopIteration 56751a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = parent.children 568b3e488b0d90d5b0dbebf02cbd20894367f728d3eRon Angeles next = __next__ 56951a447a57832da998689f81e062860b094fe922bDaniel Veillard 57036ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillard# 5711971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# converters to present a nicer view of the XPath returns 5721971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# 5731971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillarddef nodeWrap(o): 5741971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard # TODO try to cast to the most appropriate node class 5751f8658a76f155c460604fd295e7e66828c054adeDaniel Veillard name = libxml2mod.type(o) 5761971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "element" or name == "text": 5771971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlNode(_obj=o) 5781971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "attribute": 5791971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlAttr(_obj=o) 5801971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name[0:8] == "document": 5811971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlDoc(_obj=o) 5821f8658a76f155c460604fd295e7e66828c054adeDaniel Veillard if name == "namespace": 5831971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlNs(_obj=o) 5841971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "elem_decl": 5851971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlElement(_obj=o) 5861971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "attribute_decl": 5871f8658a76f155c460604fd295e7e66828c054adeDaniel Veillard return xmlAttribute(_obj=o) 5881971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "entity_decl": 5891971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlEntity(_obj=o) 5901971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "dtd": 591e59494fa5410ced5625687f025f61d30c5b2f933Daniel Veillard return xmlDtd(_obj=o) 5921971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlNode(_obj=o) 5931971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 5941971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillarddef xpathObjectRet(o): 59546459066c50190cee070ed1fcafdf6d307c09301Daniel Veillard otype = type(o) 59646459066c50190cee070ed1fcafdf6d307c09301Daniel Veillard if otype == type([]): 5973cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard ret = list(map(xpathObjectRet, o)) 59801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return ret 59946459066c50190cee070ed1fcafdf6d307c09301Daniel Veillard elif otype == type(()): 6003cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard ret = list(map(xpathObjectRet, o)) 60146459066c50190cee070ed1fcafdf6d307c09301Daniel Veillard return tuple(ret) 60246459066c50190cee070ed1fcafdf6d307c09301Daniel Veillard elif otype == type('') or otype == type(0) or otype == type(0.0): 60346459066c50190cee070ed1fcafdf6d307c09301Daniel Veillard return o 60446459066c50190cee070ed1fcafdf6d307c09301Daniel Veillard else: 60546459066c50190cee070ed1fcafdf6d307c09301Daniel Veillard return nodeWrap(o) 6061971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 6071971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# 608a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard# register an XPath function 609a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard# 610a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddef registerXPathFunction(ctxt, name, ns_uri, f): 6115e5c2d0a93e3e1bef0aaa63500cbbbd53e6a4063Daniel Veillard ret = libxml2mod.xmlRegisterXPathFunction(ctxt, name, ns_uri, f) 612a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 613a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard# 614f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard# For the xmlTextReader parser configuration 615f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard# 616f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel VeillardPARSER_LOADDTD=1 617f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel VeillardPARSER_DEFAULTATTRS=2 618f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel VeillardPARSER_VALIDATE=3 619e18fc185fa2604ba73f2b259e34796c106ad5545Daniel VeillardPARSER_SUBST_ENTITIES=4 620f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard 621f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard# 622417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard# For the error callback severities 62326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard# 624417be3ae08346c6510c28d2042dd42a22a74b331Daniel VeillardPARSER_SEVERITY_VALIDITY_WARNING=1 625417be3ae08346c6510c28d2042dd42a22a74b331Daniel VeillardPARSER_SEVERITY_VALIDITY_ERROR=2 626417be3ae08346c6510c28d2042dd42a22a74b331Daniel VeillardPARSER_SEVERITY_WARNING=3 627417be3ae08346c6510c28d2042dd42a22a74b331Daniel VeillardPARSER_SEVERITY_ERROR=4 62826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 62926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard# 6303e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# register the libxml2 error handler 63136ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillard# 6323e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillarddef registerErrorHandler(f, ctx): 6333e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard """Register a Python written function to for error reporting. 6343e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard The function is called back as f(ctx, error). """ 6353e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard import sys 6363cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard if 'libxslt' not in sys.modules: 6373e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard # normal behaviour when libxslt is not imported 6383e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard ret = libxml2mod.xmlRegisterErrorHandler(f,ctx) 6393e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard else: 6403e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard # when libxslt is already imported, one must 6413e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard # use libxst's error handler instead 6423e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard import libxslt 6433e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard ret = libxslt.registerErrorHandler(f,ctx) 6443e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard return ret 6453e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard 646e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardclass parserCtxtCore: 647e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 648e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard def __init__(self, _obj=None): 649e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if _obj != None: 650e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard self._o = _obj; 651e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return 652e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard self._o = None 653e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 654e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard def __del__(self): 655e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if self._o != None: 656e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard libxml2mod.xmlFreeParserCtxt(self._o) 6571d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack self._o = None 658e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 659417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard def setErrorHandler(self,f,arg): 660417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard """Register an error handler that will be called back as 661417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard f(arg,msg,severity,reserved). 662417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 663417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard @reserved is currently always None.""" 664417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml2mod.xmlParserCtxtSetErrorHandler(self._o,f,arg) 665e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 666417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard def getErrorHandler(self): 667417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard """Return (f,arg) as previously registered with setErrorHandler 668417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard or (None,None).""" 669417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return libxml2mod.xmlParserCtxtGetErrorHandler(self._o) 670417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 6715439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard def addLocalCatalog(self, uri): 6725439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard """Register a local catalog with the parser""" 6735439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard return libxml2mod.addLocalCatalog(self._o, uri) 6745439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 6755439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 6760e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardclass ValidCtxtCore: 6770e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 6780e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard def __init__(self, *args, **kw): 6790e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard pass 6800e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 6810e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard def setValidityErrorHandler(self, err_func, warn_func, arg=None): 6820e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard """ 6830e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard Register error and warning handlers for DTD validation. 6840e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard These will be called back as f(msg,arg) 6850e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard """ 6860e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard libxml2mod.xmlSetValidErrors(self._o, err_func, warn_func, arg) 6870e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 6880e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 6890e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardclass SchemaValidCtxtCore: 6900e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 6910e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard def __init__(self, *args, **kw): 6920e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard pass 6930e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 6940e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard def setValidityErrorHandler(self, err_func, warn_func, arg=None): 6950e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard """ 6960e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard Register error and warning handlers for Schema validation. 6970e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard These will be called back as f(msg,arg) 6980e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard """ 6990e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard libxml2mod.xmlSchemaSetValidErrors(self._o, err_func, warn_func, arg) 7000e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 7010e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 7020e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillardclass relaxNgValidCtxtCore: 7030e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 7040e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard def __init__(self, *args, **kw): 7050e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard pass 7060e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 7070e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard def setValidityErrorHandler(self, err_func, warn_func, arg=None): 7080e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard """ 7090e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard Register error and warning handlers for RelaxNG validation. 7100e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard These will be called back as f(msg,arg) 7110e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard """ 7120e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard libxml2mod.xmlRelaxNGSetValidErrors(self._o, err_func, warn_func, arg) 7130e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 7140e460da346bfb2cc9d5d6cb4be8f851c18bfb81eDaniel Veillard 7153cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillarddef _xmlTextReaderErrorFunc(xxx_todo_changeme,msg,severity,locator): 716417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard """Intermediate callback to wrap the locator""" 7173cb1ae26ec845beaea4c3a37eba7c874a7fa21a1Daniel Veillard (f,arg) = xxx_todo_changeme 718417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return f(arg,msg,severity,xmlTextReaderLocator(locator)) 719e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 72026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardclass xmlTextReaderCore: 72126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 72226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard def __init__(self, _obj=None): 72326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard self.input = None 72426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if _obj != None:self._o = _obj;return 72526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard self._o = None 72626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 72726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard def __del__(self): 72826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if self._o != None: 72926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard libxml2mod.xmlFreeTextReader(self._o) 73026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard self._o = None 73126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 732417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard def SetErrorHandler(self,f,arg): 73326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard """Register an error handler that will be called back as 734417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard f(arg,msg,severity,locator).""" 735417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if f is None: 736417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml2mod.xmlTextReaderSetErrorHandler(\ 737417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard self._o,None,None) 738417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else: 739417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml2mod.xmlTextReaderSetErrorHandler(\ 740417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard self._o,_xmlTextReaderErrorFunc,(f,arg)) 741417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 742417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard def GetErrorHandler(self): 74326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard """Return (f,arg) as previously registered with setErrorHandler 74426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard or (None,None).""" 745417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard f,arg = libxml2mod.xmlTextReaderGetErrorHandler(self._o) 746417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if f is None: 747417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return None,None 748417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else: 749417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard # assert f is _xmlTextReaderErrorFunc 750417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return arg 75126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 752f93a866079364a006189683eaa07f94c867389d1Daniel Veillard# 75348da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman# The cleanup now goes though a wrapper in libxml.c 754f93a866079364a006189683eaa07f94c867389d1Daniel Veillard# 755f93a866079364a006189683eaa07f94c867389d1Daniel Veillarddef cleanupParser(): 756f93a866079364a006189683eaa07f94c867389d1Daniel Veillard libxml2mod.xmlPythonCleanupParser() 75787ab1c129868978f1806da36496c8c519852c6adDaniel Veillard 75848da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman# 75948da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman# The interface to xmlRegisterInputCallbacks. 76048da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman# Since this API does not allow to pass a data object along with 76148da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman# match/open callbacks, it is necessary to maintain a list of all 76248da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman# Python callbacks. 76348da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman# 76448da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman__input_callbacks = [] 76548da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neymandef registerInputCallback(func): 76648da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman def findOpenCallback(URI): 76748da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman for cb in reversed(__input_callbacks): 76848da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman o = cb(URI) 76948da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman if o is not None: 77048da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman return o 77148da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman libxml2mod.xmlRegisterInputCallback(findOpenCallback) 77248da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman __input_callbacks.append(func) 77348da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman 77448da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neymandef popInputCallbacks(): 77548da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman # First pop python-level callbacks, when no more available - start 77648da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman # popping built-in ones. 77748da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman if len(__input_callbacks) > 0: 77848da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman __input_callbacks.pop() 77948da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman if len(__input_callbacks) == 0: 78048da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman libxml2mod.xmlUnregisterInputCallback() 78148da90bc4a3809728d08ee9ee8da21d044fbca82Alexey Neyman 7823e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 7833e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# 7843e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# Everything before this line comes from libxml.py 7853e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# Everything after this line is automatically generated 7863e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# 7873e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 7881971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 789