libxml.py revision f25b4cab44bb9723f5e16df05c296fa09e5b4391
15e5c2d0a93e3e1bef0aaa63500cbbbd53e6a4063Daniel Veillardimport libxml2mod
2d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
31971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#
48d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# Errors raised by the wrappers when some tree handling failed.
58d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#
68d24cc189845663509623fbd6b5106cc01266994Daniel Veillardclass treeError:
78d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def __init__(self, msg):
88d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        self.msg = msg
98d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def __str__(self):
108d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        return self.msg
118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
128d24cc189845663509623fbd6b5106cc01266994Daniel Veillardclass parserError:
138d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def __init__(self, msg):
148d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        self.msg = msg
158d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def __str__(self):
168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        return self.msg
178d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
188d24cc189845663509623fbd6b5106cc01266994Daniel Veillardclass uriError:
198d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def __init__(self, msg):
208d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        self.msg = msg
218d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def __str__(self):
228d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        return self.msg
238d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
248d24cc189845663509623fbd6b5106cc01266994Daniel Veillardclass xpathError:
258d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def __init__(self, msg):
268d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        self.msg = msg
278d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def __str__(self):
288d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        return self.msg
298d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
30c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardclass ioWrapper:
31c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def __init__(self, _obj):
32c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self.__io = _obj
33c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self._o = None
34c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
35c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def io_close(self):
36c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if self.__io == None:
37c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    return(-1)
38c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	self.__io.close()
39c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	self.__io = None
40c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(0)
41c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
42c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def io_flush(self):
43c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if self.__io == None:
44c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    return(-1)
45c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	self.__io.flush()
46c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(0)
47c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
48c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def io_read(self, len = -1):
49c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if self.__io == None:
50c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    return(-1)
51c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if len < 0:
52c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    return(self.__io.read())
53c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(self.__io.read(len))
54c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
55c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def io_write(self, str, len = -1):
56c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if self.__io == None:
57c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    return(-1)
58c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if len < 0:
59c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	    return(self.__io.write(str))
60c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard	return(self.__io.write(str, len))
61c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
62c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardclass ioReadWrapper(ioWrapper):
63c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def __init__(self, _obj, enc = ""):
64c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ioWrapper.__init__(self, _obj)
65c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self._o = libxml2mod.xmlCreateInputBuffer(self, enc)
66c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
67c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def __del__(self):
68c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        print "__del__"
69c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self.io_close()
70c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if self._o != None:
71c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard            libxml2mod.xmlFreeParserInputBuffer(self._o)
72c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self._o = None
73c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
74c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def close(self):
75c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self.io_close()
76c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if self._o != None:
77c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard            libxml2mod.xmlFreeParserInputBuffer(self._o)
78c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self._o = None
79c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
80c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillardclass ioWriteWrapper(ioWrapper):
81c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def __init__(self, _obj, enc = ""):
82c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        ioWrapper.__init__(self, _obj)
83c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self._o = libxml2mod.xmlCreateOutputBuffer(self, enc)
84c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
85c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def __del__(self):
86c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        print "__del__"
87c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self.io_close()
88c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if self._o != None:
89c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard            libxml2mod.xmlOutputBufferClose(self._o)
90c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self._o = None
91c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
92c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard    def close(self):
93c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self.io_close()
94c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        if self._o != None:
95c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard            libxml2mod.xmlOutputBufferClose(self._o)
96c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard        self._o = None
97c6d4a933f017b17cacdf2a6f6505faf8d945b0b3Daniel Veillard
988d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#
998d24cc189845663509623fbd6b5106cc01266994Daniel Veillard# Example of a class to handle SAX events
1008d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#
1018d24cc189845663509623fbd6b5106cc01266994Daniel Veillardclass SAXCallback:
1028d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    """Base class for SAX handlers"""
1038d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def startDocument(self):
1048d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called at the start of the document"""
1058d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1068d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1078d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def endDocument(self):
1088d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called at the end of the document"""
1098d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1108d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1118d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def startElement(self, tag, attrs):
1128d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called at the start of every element, tag is the name of
1138d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   the element, attrs is a dictionary of the element's attributes"""
1148d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1158d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1168d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def endElement(self, tag):
1178d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called at the start of every element, tag is the name of
1188d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   the element"""
1198d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1208d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1218d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def characters(self, data):
1228d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when character data have been read, data is the string
1238d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   containing the data, multiple consecutive characters() callback
1248d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   are possible."""
1258d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1268d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1278d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def cdataBlock(self, data):
1288d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when CDATA section have been read, data is the string
1298d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   containing the data, multiple consecutive cdataBlock() callback
1308d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   are possible."""
1318d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1328d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1338d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def reference(self, name):
1348d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when an entity reference has been found"""
1358d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1368d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1378d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def ignorableWhitespace(self, data):
1388d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when potentially ignorable white spaces have been found"""
1398d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1408d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1418d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def processingInstruction(self, target, data):
1428d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when a PI has been found, target contains the PI name and
1438d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   data is the associated data in the PI"""
1448d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1458d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1468d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def comment(self, content):
1478d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when a comment has been found, content contains the comment"""
1488d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1498d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1508d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def externalSubset(self, name, externalID, systemID):
1518d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when a DOCTYPE declaration has been found, name is the
1528d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   DTD name and externalID, systemID are the DTD public and system
1538d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   identifier for that DTd if available"""
1548d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1558d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1568d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def internalSubset(self, name, externalID, systemID):
1578d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when a DOCTYPE declaration has been found, name is the
1588d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   DTD name and externalID, systemID are the DTD public and system
1598d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   identifier for that DTD if available"""
1608d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1618d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1628d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def entityDecl(self, name, type, externalID, systemID, content):
1638d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when an ENTITY declaration has been found, name is the
1648d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   entity name and externalID, systemID are the entity public and
1658d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   system identifier for that entity if available, type indicates
1668d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   the entity type, and content reports it's string content"""
1678d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1688d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1698d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def notationDecl(self, name, externalID, systemID):
1708d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when an NOTATION declaration has been found, name is the
1718d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   notation name and externalID, systemID are the notation public and
1728d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   system identifier for that notation if available"""
1738d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1748d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1758d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def attributeDecl(self, elem, name, type, defi, defaultValue, nameList):
1768d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when an ATTRIBUTE definition has been found"""
1778d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	pass
1788d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1798d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def elementDecl(self, name, type, content):
1808d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when an ELEMENT definition has been found"""
1818d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	pass
1828d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1838d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def entityDecl(self, name, publicId, systemID, notationName):
1848d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        """called when an unparsed ENTITY declaration has been found,
1858d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   name is the entity name and publicId,, systemID are the entity
1868d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   public and system identifier for that entity if available,
1878d24cc189845663509623fbd6b5106cc01266994Daniel Veillard	   and notationName indicate the associated NOTATION"""
1888d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        pass
1898d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1908d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def warning(self, msg):
1918d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        print msg
1928d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1938d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def error(self, msg):
1948d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        raise parserError(msg)
1958d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1968d24cc189845663509623fbd6b5106cc01266994Daniel Veillard    def fatalError(self, msg):
1978d24cc189845663509623fbd6b5106cc01266994Daniel Veillard        raise parserError(msg)
1988d24cc189845663509623fbd6b5106cc01266994Daniel Veillard
1998d24cc189845663509623fbd6b5106cc01266994Daniel Veillard#
2001971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# This class is the ancestor of all the Node classes. It provides
2011971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# the basic functionalities shared by all nodes (and handle
2021971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# gracefylly the exception), like name, navigation in the tree,
2031e77438da7dd912885effa97b1079867d1e041beDaniel Veillard# doc reference, content access and serializing to a string or URI
2041971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#
20536ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillardclass xmlCore:
206d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def __init__(self, _obj=None):
207d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        if _obj != None:
20801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            self._o = _obj;
20901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return
21001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        self._o = None
211d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
212d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def __getattr__(self, attr):
213d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        if attr == "parent":
21401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            ret = libxml2mod.parent(self._o)
21501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            if ret == None:
21601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard                return None
21701a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return xmlNode(_obj=ret)
218d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard        elif attr == "properties":
21901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            ret = libxml2mod.properties(self._o)
22001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            if ret == None:
22101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard                return None
22201a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return xmlAttr(_obj=ret)
22301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        elif attr == "children":
22401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            ret = libxml2mod.children(self._o)
22501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            if ret == None:
22601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard                return None
22701a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return xmlNode(_obj=ret)
22801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        elif attr == "last":
22901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            ret = libxml2mod.last(self._o)
23001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            if ret == None:
23101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard                return None
23201a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return xmlNode(_obj=ret)
23301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        elif attr == "next":
23401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            ret = libxml2mod.next(self._o)
23501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            if ret == None:
23601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard                return None
23701a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return xmlNode(_obj=ret)
23801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        elif attr == "prev":
23901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            ret = libxml2mod.prev(self._o)
24001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            if ret == None:
24101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard                return None
24201a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return xmlNode(_obj=ret)
24301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        elif attr == "content":
24401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return libxml2mod.xmlNodeGetContent(self._o)
24501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        elif attr == "name":
24601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return libxml2mod.name(self._o)
24701a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        elif attr == "type":
24801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return libxml2mod.type(self._o)
24901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        elif attr == "doc":
25001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            ret = libxml2mod.doc(self._o)
25101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            if ret == None:
252f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard		if self.type == "document_xml" or self.type == "document_html":
253f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard		    return xmlDoc(_obj=self._o)
254f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard		else:
255f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard		    return None
256f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard            return xmlDoc(_obj=ret)
25701a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        raise AttributeError,attr
258d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard
25901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        #
26001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        # Those are common attributes to nearly all type of nodes
26101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        #
262d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def get_parent(self):
26301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        ret = libxml2mod.parent(self._o)
26401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        if ret == None:
26501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return None
26601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return xmlNode(_obj=ret)
267d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def get_children(self):
26801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        ret = libxml2mod.children(self._o)
26901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        if ret == None:
27001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return None
27101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return xmlNode(_obj=ret)
272d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def get_last(self):
27301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        ret = libxml2mod.last(self._o)
27401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        if ret == None:
27501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return None
27601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return xmlNode(_obj=ret)
277d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def get_next(self):
27801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        ret = libxml2mod.next(self._o)
27901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        if ret == None:
28001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return None
28101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return xmlNode(_obj=ret)
2821971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    def get_properties(self):
28301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        ret = libxml2mod.properties(self._o)
28401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        if ret == None:
28501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return None
28601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return xmlAttr(_obj=ret)
2871971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    def get_doc(self):
28801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        ret = libxml2mod.doc(self._o)
28901a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        if ret == None:
29001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return None
29101a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return xmlDoc(_obj=ret)
292d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def get_prev(self):
29301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        ret = libxml2mod.prev(self._o)
29401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        if ret == None:
29501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return None
29601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return xmlNode(_obj=ret)
297d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def get_content(self):
29801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return libxml2mod.xmlNodeGetContent(self._o)
2991971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    def getContent(self):
30001a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return libxml2mod.xmlNodeGetContent(self._o)
301d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def get_name(self):
30201a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return libxml2mod.name(self._o)
303d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def get_type(self):
30401a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return libxml2mod.type(self._o)
305d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def get_doc(self):
30601a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        ret = libxml2mod.doc(self._o)
30701a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        if ret == None:
30801a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard            return None
309f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard        return xmlDoc(_obj=ret)
310d2897fde0089a9f349f7a589c1e58a8e130a3d61Daniel Veillard    def free(self):
3115e5c2d0a93e3e1bef0aaa63500cbbbd53e6a4063Daniel Veillard        libxml2mod.freeDoc(self._o)
3121e77438da7dd912885effa97b1079867d1e041beDaniel Veillard
3131e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    #
3141e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    # Serialization routines, the optional arguments have the following
3151e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    # meaning:
3161e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    #     encoding: string to ask saving in a specific encoding
31712171c4db1493e7b341a719a3705011c54f5e819Daniel Veillard    #     format: if 1 the serializer is asked to indent the output
3181e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    #
3191e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    def serialize(self, encoding = None, format = 0):
3201e77438da7dd912885effa97b1079867d1e041beDaniel Veillard        return libxml2mod.serializeNode(self._o, encoding, format)
3211e77438da7dd912885effa97b1079867d1e041beDaniel Veillard    def saveTo(self, file, encoding = None, format = 0):
3221e77438da7dd912885effa97b1079867d1e041beDaniel Veillard        return libxml2mod.saveNodeTo(self._o, file, encoding, format)
32301a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard
324f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard    #
325f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard    # Selecting nodes using XPath, a bit slow because the context
326f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard    # is allocated/freed every time but convenient.
327f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard    #
328f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard    def xpathEval(self, expr):
329f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard	doc = self.doc
330f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard	if doc == None:
331f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard	    return None
332f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard	ctxt = doc.xpathNewContext()
333f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard	ctxt.setContextNode(self)
334f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard	res = ctxt.xpathEval(expr)
335f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard	ctxt.xpathFreeContext()
336f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard	return res
337f742d3417905e5a0f4785f9684c3a7427e139ca7Daniel Veillard
33836ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillard#
3391971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard# converters to present a nicer view of the XPath returns
3401971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#
3411971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillarddef nodeWrap(o):
3421971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    # TODO try to cast to the most appropriate node class
3435e5c2d0a93e3e1bef0aaa63500cbbbd53e6a4063Daniel Veillard    name = libxml2mod.name(o)
3441971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    if name == "element" or name == "text":
3451971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard        return xmlNode(_obj=o)
3461971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    if name == "attribute":
3471971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard        return xmlAttr(_obj=o)
3481971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    if name[0:8] == "document":
3491971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard        return xmlDoc(_obj=o)
3501971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    if name[0:8] == "namespace":
3511971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard        return xmlNs(_obj=o)
3521971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    if name == "elem_decl":
3531971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard        return xmlElement(_obj=o)
3541971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    if name == "attribute_decl":
3551971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard        return xmlAtribute(_obj=o)
3561971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    if name == "entity_decl":
3571971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard        return xmlEntity(_obj=o)
3581971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    if name == "dtd":
3591971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard        return xmlAttr(_obj=o)
3601971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    return xmlNode(_obj=o)
3611971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
3621971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillarddef xpathObjectRet(o):
3631971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    if type(o) == type([]) or type(o) == type(()):
3641971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard        ret = map(lambda x: nodeWrap(x), o)
36501a6d4170c87368621db478b4d98530265bb9b1fDaniel Veillard        return ret
3661971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard    return o
3671971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
3681971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard#
369a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard# register an XPath function
370a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#
371a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillarddef registerXPathFunction(ctxt, name, ns_uri, f):
3725e5c2d0a93e3e1bef0aaa63500cbbbd53e6a4063Daniel Veillard    ret = libxml2mod.xmlRegisterXPathFunction(ctxt, name, ns_uri, f)
373a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard
374797a565a2f6a2c0a8480670174e9eaef30d271a4Daniel Veillard
375a7340c830e4bddd86201cfdb97ac81e30b0dee62Daniel Veillard#
376f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard# For the xmlTextReader parser configuration
377f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard#
378f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel VeillardPARSER_LOADDTD=1
379f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel VeillardPARSER_DEFAULTATTRS=2
380f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel VeillardPARSER_VALIDATE=3
381f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard
382f25b4cab44bb9723f5e16df05c296fa09e5b4391Daniel Veillard#
38336ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillard# Everything below this point is automatically generated
38436ed5290a2dd1d44ddc0f102f6251156ad6965b9Daniel Veillard#
3851971ee2698cb84c7699c96d3302f00e20d42c0d3Daniel Veillard
386