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