libxml.py revision a81355ef66bbbda49987309b748e5681075695ed
15e5c2d0a93e3e1bef0aaa63500cbbbd53e6a4063Daniel Veillardimport libxml2mod 285bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillardimport types 3d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard 4a81355ef66bbbda49987309b748e5681075695edDaniel Veillard# The root of all libxml2 errors. 5a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass libxmlError(Exception): pass 6a81355ef66bbbda49987309b748e5681075695edDaniel Veillard 71971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# 88d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# Errors raised by the wrappers when some tree handling failed. 98d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# 10a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass treeError(libxmlError): 118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __init__(self, msg): 128d24cc189845663509623fbd6b5106cc01266994Daniel Veillard self.msg = msg 138d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __str__(self): 148d24cc189845663509623fbd6b5106cc01266994Daniel Veillard return self.msg 158d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 16a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass parserError(libxmlError): 178d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __init__(self, msg): 188d24cc189845663509623fbd6b5106cc01266994Daniel Veillard self.msg = msg 198d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __str__(self): 208d24cc189845663509623fbd6b5106cc01266994Daniel Veillard return self.msg 218d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 22a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass uriError(libxmlError): 238d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __init__(self, msg): 248d24cc189845663509623fbd6b5106cc01266994Daniel Veillard self.msg = msg 258d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __str__(self): 268d24cc189845663509623fbd6b5106cc01266994Daniel Veillard return self.msg 278d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 28a81355ef66bbbda49987309b748e5681075695edDaniel Veillardclass xpathError(libxmlError): 298d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __init__(self, msg): 308d24cc189845663509623fbd6b5106cc01266994Daniel Veillard self.msg = msg 318d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def __str__(self): 328d24cc189845663509623fbd6b5106cc01266994Daniel Veillard return self.msg 338d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 34c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardclass ioWrapper: 35c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __init__(self, _obj): 36c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self.__io = _obj 37c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 38c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 39c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def io_close(self): 40c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self.__io == None: 411d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(-1) 421d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack self.__io.close() 431d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack self.__io = None 441d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(0) 45c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 46c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def io_flush(self): 47c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self.__io == None: 481d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(-1) 491d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack self.__io.flush() 501d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(0) 51c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 52c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def io_read(self, len = -1): 53c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self.__io == None: 541d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(-1) 55c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if len < 0: 561d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(self.__io.read()) 571d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(self.__io.read(len)) 58c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 59c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def io_write(self, str, len = -1): 60c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self.__io == None: 611d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(-1) 62c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if len < 0: 631d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(self.__io.write(str)) 641d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return(self.__io.write(str, len)) 65c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 66c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardclass ioReadWrapper(ioWrapper): 67c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __init__(self, _obj, enc = ""): 68c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard ioWrapper.__init__(self, _obj) 69c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = libxml2mod.xmlCreateInputBuffer(self, enc) 70c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 71c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __del__(self): 72c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard print "__del__" 73c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self.io_close() 74c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self._o != None: 75c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard libxml2mod.xmlFreeParserInputBuffer(self._o) 76c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 77c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 78c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def close(self): 79c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self.io_close() 80c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self._o != None: 81c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard libxml2mod.xmlFreeParserInputBuffer(self._o) 82c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 83c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 84c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardclass ioWriteWrapper(ioWrapper): 85c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __init__(self, _obj, enc = ""): 8685bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard# print "ioWriteWrapper.__init__", _obj 8785bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard if type(_obj) == type(''): 8837e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack print "write io from a string" 8937e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack self.o = None 9037e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack elif type(_obj) == types.InstanceType: 9137e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack print "write io from instance of %s" % (_obj.__class__) 9237e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack ioWrapper.__init__(self, _obj) 9337e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack self._o = libxml2mod.xmlCreateOutputBuffer(self, enc) 9437e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack else: 9537e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack file = libxml2mod.outputBufferGetPythonFile(_obj) 9637e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack if file != None: 9737e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack ioWrapper.__init__(self, file) 9837e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack else: 9937e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack ioWrapper.__init__(self, _obj) 10037e63946dc2745dc1e546ac273e43512fb4685fcWilliam M. Brack self._o = _obj 101c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 102c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def __del__(self): 10385bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard# print "__del__" 104c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self.io_close() 105c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self._o != None: 106c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard libxml2mod.xmlOutputBufferClose(self._o) 107c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 108c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 10985bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard def flush(self): 11085bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard self.io_flush() 11185bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard if self._o != None: 11285bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard libxml2mod.xmlOutputBufferClose(self._o) 11385bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard self._o = None 11485bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard 115c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard def close(self): 11685bb5b08df98f19dfb4b23a5ee0b3596a0d8326bDaniel Veillard self.io_flush() 117c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard if self._o != None: 118c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard libxml2mod.xmlOutputBufferClose(self._o) 119c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard self._o = None 120c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard 1218d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# 1228d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# Example of a class to handle SAX events 1238d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# 1248d24cc189845663509623fbd6b5106cc01266994Daniel Veillardclass SAXCallback: 1258d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """Base class for SAX handlers""" 1268d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def startDocument(self): 1278d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called at the start of the document""" 1288d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1298d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1308d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def endDocument(self): 1318d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called at the end of the document""" 1328d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1338d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1348d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def startElement(self, tag, attrs): 1358d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called at the start of every element, tag is the name of 1361d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack the element, attrs is a dictionary of the element's attributes""" 1378d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1388d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1398d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def endElement(self, tag): 1408d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called at the start of every element, tag is the name of 1411d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack the element""" 1428d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1438d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1448d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def characters(self, data): 1458d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when character data have been read, data is the string 1461d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack containing the data, multiple consecutive characters() callback 1471d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack are possible.""" 1488d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1498d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1508d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def cdataBlock(self, data): 1518d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when CDATA section have been read, data is the string 1521d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack containing the data, multiple consecutive cdataBlock() callback 1531d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack are possible.""" 1548d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1558d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1568d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def reference(self, name): 1578d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an entity reference has been found""" 1588d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1598d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1608d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def ignorableWhitespace(self, data): 1618d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when potentially ignorable white spaces have been found""" 1628d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1638d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1648d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def processingInstruction(self, target, data): 1658d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when a PI has been found, target contains the PI name and 1661d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack data is the associated data in the PI""" 1678d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1688d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1698d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def comment(self, content): 1708d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when a comment has been found, content contains the comment""" 1718d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1728d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def externalSubset(self, name, externalID, systemID): 1748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when a DOCTYPE declaration has been found, name is the 1751d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack DTD name and externalID, systemID are the DTD public and system 1761d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack identifier for that DTd if available""" 1778d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1798d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def internalSubset(self, name, externalID, systemID): 1808d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when a DOCTYPE declaration has been found, name is the 1811d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack DTD name and externalID, systemID are the DTD public and system 1821d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack identifier for that DTD if available""" 1838d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1848d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1858d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def entityDecl(self, name, type, externalID, systemID, content): 1868d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an ENTITY declaration has been found, name is the 1871d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack entity name and externalID, systemID are the entity public and 1881d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack system identifier for that entity if available, type indicates 1891d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack the entity type, and content reports it's string content""" 1908d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1918d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1928d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def notationDecl(self, name, externalID, systemID): 1938d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an NOTATION declaration has been found, name is the 1941d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack notation name and externalID, systemID are the notation public and 1951d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack system identifier for that notation if available""" 1968d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 1978d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 1988d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def attributeDecl(self, elem, name, type, defi, defaultValue, nameList): 1998d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an ATTRIBUTE definition has been found""" 2001d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack pass 2018d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2028d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def elementDecl(self, name, type, content): 2038d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an ELEMENT definition has been found""" 2041d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack pass 2058d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2068d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def entityDecl(self, name, publicId, systemID, notationName): 2078d24cc189845663509623fbd6b5106cc01266994Daniel Veillard """called when an unparsed ENTITY declaration has been found, 2081d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack name is the entity name and publicId,, systemID are the entity 2091d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack public and system identifier for that entity if available, 2101d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack and notationName indicate the associated NOTATION""" 2118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard pass 2128d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2138d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def warning(self, msg): 2148d24cc189845663509623fbd6b5106cc01266994Daniel Veillard print msg 2158d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def error(self, msg): 2178d24cc189845663509623fbd6b5106cc01266994Daniel Veillard raise parserError(msg) 2188d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2198d24cc189845663509623fbd6b5106cc01266994Daniel Veillard def fatalError(self, msg): 2208d24cc189845663509623fbd6b5106cc01266994Daniel Veillard raise parserError(msg) 2218d24cc189845663509623fbd6b5106cc01266994Daniel Veillard 2228d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# 2231971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# This class is the ancestor of all the Node classes. It provides 2241971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# the basic functionalities shared by all nodes (and handle 2251971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# gracefylly the exception), like name, navigation in the tree, 2261e77438da7dd912885effa97b1079867d1e041beDaniel Veillard# doc reference, content access and serializing to a string or URI 2271971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# 22836ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillardclass xmlCore: 229d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def __init__(self, _obj=None): 230d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard if _obj != None: 23101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard self._o = _obj; 23201a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return 23301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard self._o = None 234d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_parent(self): 23501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.parent(self._o) 23601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 23701a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 23801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return xmlNode(_obj=ret) 239d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_children(self): 24001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.children(self._o) 24101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 24201a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 24301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return xmlNode(_obj=ret) 244d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_last(self): 24501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.last(self._o) 24601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 24701a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 24801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return xmlNode(_obj=ret) 249d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_next(self): 25001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.next(self._o) 25101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 25201a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 25301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return xmlNode(_obj=ret) 2541971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard def get_properties(self): 25501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.properties(self._o) 25601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 25701a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 25801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return xmlAttr(_obj=ret) 259d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_prev(self): 26001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard ret = libxml2mod.prev(self._o) 26101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard if ret == None: 26201a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return None 26301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return xmlNode(_obj=ret) 264d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_content(self): 26501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return libxml2mod.xmlNodeGetContent(self._o) 26651a447a57832da998689f81e062860b094fe922bDaniel Veillard getContent = get_content # why is this duplicate naming needed ? 267d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_name(self): 26801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return libxml2mod.name(self._o) 269d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard def get_type(self): 27001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return libxml2mod.type(self._o) 27151a447a57832da998689f81e062860b094fe922bDaniel Veillard def get_doc(self): 27251a447a57832da998689f81e062860b094fe922bDaniel Veillard ret = libxml2mod.doc(self._o) 27351a447a57832da998689f81e062860b094fe922bDaniel Veillard if ret == None: 27451a447a57832da998689f81e062860b094fe922bDaniel Veillard if self.type in ["document_xml", "document_html"]: 27551a447a57832da998689f81e062860b094fe922bDaniel Veillard return xmlDoc(_obj=self._o) 27651a447a57832da998689f81e062860b094fe922bDaniel Veillard else: 27751a447a57832da998689f81e062860b094fe922bDaniel Veillard return None 27851a447a57832da998689f81e062860b094fe922bDaniel Veillard return xmlDoc(_obj=ret) 27951a447a57832da998689f81e062860b094fe922bDaniel Veillard # 28051a447a57832da998689f81e062860b094fe922bDaniel Veillard # Those are common attributes to nearly all type of nodes 28151a447a57832da998689f81e062860b094fe922bDaniel Veillard # defined as python2 properties 28251a447a57832da998689f81e062860b094fe922bDaniel Veillard # 28351a447a57832da998689f81e062860b094fe922bDaniel Veillard import sys 28451a447a57832da998689f81e062860b094fe922bDaniel Veillard if float(sys.version[0:3]) < 2.2: 2851d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack def __getattr__(self, attr): 2861d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if attr == "parent": 2871d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.parent(self._o) 2881d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 2891d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 2901d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlNode(_obj=ret) 2911d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "properties": 2921d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.properties(self._o) 2931d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 2941d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 2951d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlAttr(_obj=ret) 2961d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "children": 2971d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.children(self._o) 2981d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 2991d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 3001d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlNode(_obj=ret) 3011d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "last": 3021d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.last(self._o) 3031d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3041d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 3051d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlNode(_obj=ret) 3061d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "next": 3071d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.next(self._o) 3081d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3091d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 3101d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlNode(_obj=ret) 3111d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "prev": 3121d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.prev(self._o) 3131d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3141d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 3151d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlNode(_obj=ret) 3161d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "content": 3171d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return libxml2mod.xmlNodeGetContent(self._o) 3181d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "name": 3191d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return libxml2mod.name(self._o) 3201d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "type": 3211d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return libxml2mod.type(self._o) 3221d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack elif attr == "doc": 3231d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ret = libxml2mod.doc(self._o) 3241d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if ret == None: 3251d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if self.type == "document_xml" or self.type == "document_html": 3261d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlDoc(_obj=self._o) 3271d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack else: 3281d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 3291d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return xmlDoc(_obj=ret) 3301d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack raise AttributeError,attr 33151a447a57832da998689f81e062860b094fe922bDaniel Veillard else: 3321d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack parent = property(get_parent, None, None, "Parent node") 3331d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack children = property(get_children, None, None, "First child node") 3341d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack last = property(get_last, None, None, "Last sibling node") 3351d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack next = property(get_next, None, None, "Next sibling node") 3361d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack prev = property(get_prev, None, None, "Previous sibling node") 3371d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack properties = property(get_properties, None, None, "List of properies") 3381d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack content = property(get_content, None, None, "Content of this node") 3391d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack name = property(get_name, None, None, "Node name") 3401d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack type = property(get_type, None, None, "Node type") 3411d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack doc = property(get_doc, None, None, "The document this node belongs to") 3421e77438da7dd912885effa97b1079867d1e041beDaniel Veillard 3431e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # 3441e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # Serialization routines, the optional arguments have the following 3451e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # meaning: 3461e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # encoding: string to ask saving in a specific encoding 34751a447a57832da998689f81e062860b094fe922bDaniel Veillard # indent: if 1 the serializer is asked to indent the output 3481e77438da7dd912885effa97b1079867d1e041beDaniel Veillard # 3491e77438da7dd912885effa97b1079867d1e041beDaniel Veillard def serialize(self, encoding = None, format = 0): 3501e77438da7dd912885effa97b1079867d1e041beDaniel Veillard return libxml2mod.serializeNode(self._o, encoding, format) 3511e77438da7dd912885effa97b1079867d1e041beDaniel Veillard def saveTo(self, file, encoding = None, format = 0): 3521e77438da7dd912885effa97b1079867d1e041beDaniel Veillard return libxml2mod.saveNodeTo(self._o, file, encoding, format) 35301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard 354f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard # 355d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # Canonicalization routines: 356d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # 357d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # nodes: the node set (tuple or list) to be included in the 358d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # canonized image or None if all document nodes should be 359d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # included. 360d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # exclusive: the exclusive flag (0 - non-exclusive 361d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # canonicalization; otherwise - exclusive canonicalization) 362d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # prefixes: the list of inclusive namespace prefixes (strings), 363d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # or None if there is no inclusive namespaces (only for 364d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # exclusive canonicalization, ignored otherwise) 365d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # with_comments: include comments in the result (!=0) or not 366d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # (==0) 367d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard def c14nMemory(self, 368d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes=None, 369d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive=0, 370d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes=None, 371d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments=0): 372d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if nodes: 373d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes = map(lambda n: n._o, nodes) 374d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return libxml2mod.xmlC14NDocDumpMemory( 375d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard self.get_doc()._o, 376d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes, 377d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive != 0, 378d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes, 379d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments != 0) 380d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard def c14nSaveTo(self, 381d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard file, 382d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes=None, 383d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive=0, 384d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes=None, 385d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments=0): 386d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard if nodes: 387d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes = map(lambda n: n._o, nodes) 388d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard return libxml2mod.xmlC14NDocSaveTo( 389d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard self.get_doc()._o, 390d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard nodes, 391d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard exclusive != 0, 392d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard prefixes, 393d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard with_comments != 0, 394d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard file) 395d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard 396d5e198ad454803c60b898451ff432f2fcf0e95ceDaniel Veillard # 397f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard # Selecting nodes using XPath, a bit slow because the context 398f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard # is allocated/freed every time but convenient. 399f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard # 400f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard def xpathEval(self, expr): 4011d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack doc = self.doc 4021d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack if doc == None: 4031d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return None 4041d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ctxt = doc.xpathNewContext() 4051d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ctxt.setContextNode(self) 4061d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack res = ctxt.xpathEval(expr) 4071d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack ctxt.xpathFreeContext() 4081d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack return res 40951a447a57832da998689f81e062860b094fe922bDaniel Veillard 410f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # 411f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # Selecting nodes using XPath, faster because the context 412f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # is allocated just once per xmlDoc. 413f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # 414f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # Removed: DV memleaks c.f. #126735 415f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# # 416f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# def xpathEval2(self, expr): 417f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# doc = self.doc 418f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# if doc == None: 419f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# return None 420f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# try: 421f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# doc._ctxt.setContextNode(self) 422f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# except: 423f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# doc._ctxt = doc.xpathNewContext() 424f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# doc._ctxt.setContextNode(self) 425f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# res = doc._ctxt.xpathEval(expr) 426f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard# return res 42751a447a57832da998689f81e062860b094fe922bDaniel Veillard def xpathEval2(self, expr): 428f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard return self.xpathEval(expr) 42951a447a57832da998689f81e062860b094fe922bDaniel Veillard 43051a447a57832da998689f81e062860b094fe922bDaniel Veillard # support for python2 iterators 43151a447a57832da998689f81e062860b094fe922bDaniel Veillard def walk_depth_first(self): 43251a447a57832da998689f81e062860b094fe922bDaniel Veillard return xmlCoreDepthFirstItertor(self) 43351a447a57832da998689f81e062860b094fe922bDaniel Veillard def walk_breadth_first(self): 43451a447a57832da998689f81e062860b094fe922bDaniel Veillard return xmlCoreBreadthFirstItertor(self) 43551a447a57832da998689f81e062860b094fe922bDaniel Veillard __iter__ = walk_depth_first 43651a447a57832da998689f81e062860b094fe922bDaniel Veillard 43751a447a57832da998689f81e062860b094fe922bDaniel Veillard def free(self): 43851a447a57832da998689f81e062860b094fe922bDaniel Veillard try: 43951a447a57832da998689f81e062860b094fe922bDaniel Veillard self.doc._ctxt.xpathFreeContext() 44051a447a57832da998689f81e062860b094fe922bDaniel Veillard except: 44151a447a57832da998689f81e062860b094fe922bDaniel Veillard pass 442f88d8cf9f1c9538dba187290ad5add003dc22bc7Daniel Veillard libxml2mod.xmlFreeDoc(self._o) 44351a447a57832da998689f81e062860b094fe922bDaniel Veillard 44451a447a57832da998689f81e062860b094fe922bDaniel Veillard 44551a447a57832da998689f81e062860b094fe922bDaniel Veillard# 44651a447a57832da998689f81e062860b094fe922bDaniel Veillard# implements the depth-first iterator for libxml2 DOM tree 44751a447a57832da998689f81e062860b094fe922bDaniel Veillard# 44851a447a57832da998689f81e062860b094fe922bDaniel Veillardclass xmlCoreDepthFirstItertor: 44951a447a57832da998689f81e062860b094fe922bDaniel Veillard def __init__(self, node): 45051a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = node 45151a447a57832da998689f81e062860b094fe922bDaniel Veillard self.parents = [] 45251a447a57832da998689f81e062860b094fe922bDaniel Veillard def __iter__(self): 45351a447a57832da998689f81e062860b094fe922bDaniel Veillard return self 45451a447a57832da998689f81e062860b094fe922bDaniel Veillard def next(self): 45551a447a57832da998689f81e062860b094fe922bDaniel Veillard while 1: 45651a447a57832da998689f81e062860b094fe922bDaniel Veillard if self.node: 45751a447a57832da998689f81e062860b094fe922bDaniel Veillard ret = self.node 45851a447a57832da998689f81e062860b094fe922bDaniel Veillard self.parents.append(self.node) 45951a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = self.node.children 46051a447a57832da998689f81e062860b094fe922bDaniel Veillard return ret 46151a447a57832da998689f81e062860b094fe922bDaniel Veillard try: 46251a447a57832da998689f81e062860b094fe922bDaniel Veillard parent = self.parents.pop() 46351a447a57832da998689f81e062860b094fe922bDaniel Veillard except IndexError: 46451a447a57832da998689f81e062860b094fe922bDaniel Veillard raise StopIteration 46551a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = parent.next 46651a447a57832da998689f81e062860b094fe922bDaniel Veillard 46751a447a57832da998689f81e062860b094fe922bDaniel Veillard# 46851a447a57832da998689f81e062860b094fe922bDaniel Veillard# implements the breadth-first iterator for libxml2 DOM tree 46951a447a57832da998689f81e062860b094fe922bDaniel Veillard# 47051a447a57832da998689f81e062860b094fe922bDaniel Veillardclass xmlCoreBreadthFirstItertor: 47151a447a57832da998689f81e062860b094fe922bDaniel Veillard def __init__(self, node): 47251a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = node 47351a447a57832da998689f81e062860b094fe922bDaniel Veillard self.parents = [] 47451a447a57832da998689f81e062860b094fe922bDaniel Veillard def __iter__(self): 47551a447a57832da998689f81e062860b094fe922bDaniel Veillard return self 47651a447a57832da998689f81e062860b094fe922bDaniel Veillard def next(self): 47751a447a57832da998689f81e062860b094fe922bDaniel Veillard while 1: 47851a447a57832da998689f81e062860b094fe922bDaniel Veillard if self.node: 47951a447a57832da998689f81e062860b094fe922bDaniel Veillard ret = self.node 48051a447a57832da998689f81e062860b094fe922bDaniel Veillard self.parents.append(self.node) 48151a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = self.node.next 48251a447a57832da998689f81e062860b094fe922bDaniel Veillard return ret 48351a447a57832da998689f81e062860b094fe922bDaniel Veillard try: 48451a447a57832da998689f81e062860b094fe922bDaniel Veillard parent = self.parents.pop() 48551a447a57832da998689f81e062860b094fe922bDaniel Veillard except IndexError: 48651a447a57832da998689f81e062860b094fe922bDaniel Veillard raise StopIteration 48751a447a57832da998689f81e062860b094fe922bDaniel Veillard self.node = parent.children 48851a447a57832da998689f81e062860b094fe922bDaniel Veillard 48936ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillard# 4901971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# converters to present a nicer view of the XPath returns 4911971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# 4921971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillarddef nodeWrap(o): 4931971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard # TODO try to cast to the most appropriate node class 4941f8658a76f155c460604fd295e7e66828c054adeDaniel Veillard name = libxml2mod.type(o) 4951971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "element" or name == "text": 4961971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlNode(_obj=o) 4971971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "attribute": 4981971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlAttr(_obj=o) 4991971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name[0:8] == "document": 5001971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlDoc(_obj=o) 5011f8658a76f155c460604fd295e7e66828c054adeDaniel Veillard if name == "namespace": 5021971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlNs(_obj=o) 5031971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "elem_decl": 5041971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlElement(_obj=o) 5051971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "attribute_decl": 5061f8658a76f155c460604fd295e7e66828c054adeDaniel Veillard return xmlAttribute(_obj=o) 5071971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "entity_decl": 5081971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlEntity(_obj=o) 5091971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if name == "dtd": 510e59494fa5410ced5625687f025f61d30c5b2f933Daniel Veillard return xmlDtd(_obj=o) 5111971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return xmlNode(_obj=o) 5121971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 5131971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillarddef xpathObjectRet(o): 5141971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard if type(o) == type([]) or type(o) == type(()): 5151971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard ret = map(lambda x: nodeWrap(x), o) 51601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard return ret 5171971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard return o 5181971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 5191971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# 520a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard# register an XPath function 521a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard# 522a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddef registerXPathFunction(ctxt, name, ns_uri, f): 5235e5c2d0a93e3e1bef0aaa63500cbbbd53e6a4063Daniel Veillard ret = libxml2mod.xmlRegisterXPathFunction(ctxt, name, ns_uri, f) 524a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard 525a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard# 526f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard# For the xmlTextReader parser configuration 527f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard# 528f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel VeillardPARSER_LOADDTD=1 529f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel VeillardPARSER_DEFAULTATTRS=2 530f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel VeillardPARSER_VALIDATE=3 531e18fc185fa2604ba73f2b259e34796c106ad5545Daniel VeillardPARSER_SUBST_ENTITIES=4 532f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard 533f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard# 534417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard# For the error callback severities 53526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard# 536417be3ae08346c6510c28d2042dd42a22a74b331Daniel VeillardPARSER_SEVERITY_VALIDITY_WARNING=1 537417be3ae08346c6510c28d2042dd42a22a74b331Daniel VeillardPARSER_SEVERITY_VALIDITY_ERROR=2 538417be3ae08346c6510c28d2042dd42a22a74b331Daniel VeillardPARSER_SEVERITY_WARNING=3 539417be3ae08346c6510c28d2042dd42a22a74b331Daniel VeillardPARSER_SEVERITY_ERROR=4 54026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 54126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard# 5423e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# register the libxml2 error handler 54336ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillard# 5443e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillarddef registerErrorHandler(f, ctx): 5453e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard """Register a Python written function to for error reporting. 5463e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard The function is called back as f(ctx, error). """ 5473e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard import sys 5483e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard if not sys.modules.has_key('libxslt'): 5493e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard # normal behaviour when libxslt is not imported 5503e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard ret = libxml2mod.xmlRegisterErrorHandler(f,ctx) 5513e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard else: 5523e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard # when libxslt is already imported, one must 5533e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard # use libxst's error handler instead 5543e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard import libxslt 5553e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard ret = libxslt.registerErrorHandler(f,ctx) 5563e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard return ret 5573e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard 558e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillardclass parserCtxtCore: 559e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 560e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard def __init__(self, _obj=None): 561e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if _obj != None: 562e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard self._o = _obj; 563e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard return 564e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard self._o = None 565e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 566e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard def __del__(self): 567e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard if self._o != None: 568e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard libxml2mod.xmlFreeParserCtxt(self._o) 5691d75c8a822dbe6608e646cdbbeb174a3a4ab49c0William M. Brack self._o = None 570e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 571417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard def setErrorHandler(self,f,arg): 572417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard """Register an error handler that will be called back as 573417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard f(arg,msg,severity,reserved). 574417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 575417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard @reserved is currently always None.""" 576417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml2mod.xmlParserCtxtSetErrorHandler(self._o,f,arg) 577e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 578417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard def getErrorHandler(self): 579417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard """Return (f,arg) as previously registered with setErrorHandler 580417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard or (None,None).""" 581417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return libxml2mod.xmlParserCtxtGetErrorHandler(self._o) 582417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 5835439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard def addLocalCatalog(self, uri): 5845439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard """Register a local catalog with the parser""" 5855439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard return libxml2mod.addLocalCatalog(self._o, uri) 5865439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 5875439624bd9167dbb880ea4a75d91677d20a6ebe3Daniel Veillard 588417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillarddef _xmlTextReaderErrorFunc((f,arg),msg,severity,locator): 589417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard """Intermediate callback to wrap the locator""" 590417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return f(arg,msg,severity,xmlTextReaderLocator(locator)) 591e6227e0549490b5bf9271ecd2d874a97c3f4852bDaniel Veillard 59226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillardclass xmlTextReaderCore: 59326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 59426f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard def __init__(self, _obj=None): 59526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard self.input = None 59626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if _obj != None:self._o = _obj;return 59726f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard self._o = None 59826f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 59926f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard def __del__(self): 60026f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard if self._o != None: 60126f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard libxml2mod.xmlFreeTextReader(self._o) 60226f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard self._o = None 60326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 604417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard def SetErrorHandler(self,f,arg): 60526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard """Register an error handler that will be called back as 606417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard f(arg,msg,severity,locator).""" 607417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if f is None: 608417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml2mod.xmlTextReaderSetErrorHandler(\ 609417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard self._o,None,None) 610417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else: 611417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard libxml2mod.xmlTextReaderSetErrorHandler(\ 612417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard self._o,_xmlTextReaderErrorFunc,(f,arg)) 613417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard 614417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard def GetErrorHandler(self): 61526f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard """Return (f,arg) as previously registered with setErrorHandler 61626f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard or (None,None).""" 617417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard f,arg = libxml2mod.xmlTextReaderGetErrorHandler(self._o) 618417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard if f is None: 619417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return None,None 620417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard else: 621417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard # assert f is _xmlTextReaderErrorFunc 622417be3ae08346c6510c28d2042dd42a22a74b331Daniel Veillard return arg 62326f70269c80140a7fb8a7aae9ef09c95efa98e70Daniel Veillard 624f93a866079364a006189683eaa07f94c867389d1Daniel Veillard# 625f93a866079364a006189683eaa07f94c867389d1Daniel Veillard# The cleanup now goes though a wrappe in libxml.c 626f93a866079364a006189683eaa07f94c867389d1Daniel Veillard# 627f93a866079364a006189683eaa07f94c867389d1Daniel Veillarddef cleanupParser(): 628f93a866079364a006189683eaa07f94c867389d1Daniel Veillard libxml2mod.xmlPythonCleanupParser() 62987ab1c129868978f1806da36496c8c519852c6adDaniel Veillard 6303e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 6313e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# 6323e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# Everything before this line comes from libxml.py 6333e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# Everything after this line is automatically generated 6343e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# 6353e20a2921373677d1cf54fcf6081b3492e0c7558Daniel Veillard# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING 6361971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard 637