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