blob: 41103c66ade3375f4fd88d3f638691f7cb3798c7 [file] [log] [blame]
Daniel Veillard5e5c2d02002-02-09 18:03:01 +00001import libxml2mod
Daniel Veillard85bb5b02003-12-04 14:12:05 +00002import types
Daniel Veillardd2897fd2002-01-30 16:37:32 +00003
Daniel Veillard1971ee22002-01-31 20:29:19 +00004#
Daniel Veillard8d24cc12002-03-05 15:41:29 +00005# Errors raised by the wrappers when some tree handling failed.
6#
7class treeError:
8 def __init__(self, msg):
9 self.msg = msg
10 def __str__(self):
11 return self.msg
12
13class parserError:
14 def __init__(self, msg):
15 self.msg = msg
16 def __str__(self):
17 return self.msg
18
19class uriError:
20 def __init__(self, msg):
21 self.msg = msg
22 def __str__(self):
23 return self.msg
24
25class xpathError:
26 def __init__(self, msg):
27 self.msg = msg
28 def __str__(self):
29 return self.msg
30
Daniel Veillardc6d4a932002-09-12 15:00:57 +000031class ioWrapper:
32 def __init__(self, _obj):
33 self.__io = _obj
34 self._o = None
35
36 def io_close(self):
37 if self.__io == None:
William M. Brack1d75c8a2003-10-27 13:48:16 +000038 return(-1)
39 self.__io.close()
40 self.__io = None
41 return(0)
Daniel Veillardc6d4a932002-09-12 15:00:57 +000042
43 def io_flush(self):
44 if self.__io == None:
William M. Brack1d75c8a2003-10-27 13:48:16 +000045 return(-1)
46 self.__io.flush()
47 return(0)
Daniel Veillardc6d4a932002-09-12 15:00:57 +000048
49 def io_read(self, len = -1):
50 if self.__io == None:
William M. Brack1d75c8a2003-10-27 13:48:16 +000051 return(-1)
Daniel Veillardc6d4a932002-09-12 15:00:57 +000052 if len < 0:
William M. Brack1d75c8a2003-10-27 13:48:16 +000053 return(self.__io.read())
54 return(self.__io.read(len))
Daniel Veillardc6d4a932002-09-12 15:00:57 +000055
56 def io_write(self, str, len = -1):
57 if self.__io == None:
William M. Brack1d75c8a2003-10-27 13:48:16 +000058 return(-1)
Daniel Veillardc6d4a932002-09-12 15:00:57 +000059 if len < 0:
William M. Brack1d75c8a2003-10-27 13:48:16 +000060 return(self.__io.write(str))
61 return(self.__io.write(str, len))
Daniel Veillardc6d4a932002-09-12 15:00:57 +000062
63class ioReadWrapper(ioWrapper):
64 def __init__(self, _obj, enc = ""):
65 ioWrapper.__init__(self, _obj)
66 self._o = libxml2mod.xmlCreateInputBuffer(self, enc)
67
68 def __del__(self):
69 print "__del__"
70 self.io_close()
71 if self._o != None:
72 libxml2mod.xmlFreeParserInputBuffer(self._o)
73 self._o = None
74
75 def close(self):
76 self.io_close()
77 if self._o != None:
78 libxml2mod.xmlFreeParserInputBuffer(self._o)
79 self._o = None
80
81class ioWriteWrapper(ioWrapper):
82 def __init__(self, _obj, enc = ""):
Daniel Veillard85bb5b02003-12-04 14:12:05 +000083# print "ioWriteWrapper.__init__", _obj
84 if type(_obj) == type(''):
85 print "write io from a string"
86 self.o = None
87 elif type(_obj) == types.InstanceType:
88 print "write io from instance of %s" % (_obj.__class__)
89 ioWrapper.__init__(self, _obj)
90 self._o = libxml2mod.xmlCreateOutputBuffer(self, enc)
91 else:
92 file = libxml2mod.outputBufferGetPythonFile(_obj)
93 if file != None:
94 ioWrapper.__init__(self, file)
95 else:
96 ioWrapper.__init__(self, _obj)
97 self._o = _obj
Daniel Veillardc6d4a932002-09-12 15:00:57 +000098
99 def __del__(self):
Daniel Veillard85bb5b02003-12-04 14:12:05 +0000100# print "__del__"
Daniel Veillardc6d4a932002-09-12 15:00:57 +0000101 self.io_close()
102 if self._o != None:
103 libxml2mod.xmlOutputBufferClose(self._o)
104 self._o = None
105
Daniel Veillard85bb5b02003-12-04 14:12:05 +0000106 def flush(self):
107 self.io_flush()
108 if self._o != None:
109 libxml2mod.xmlOutputBufferClose(self._o)
110 self._o = None
111
Daniel Veillardc6d4a932002-09-12 15:00:57 +0000112 def close(self):
Daniel Veillard85bb5b02003-12-04 14:12:05 +0000113 self.io_flush()
Daniel Veillardc6d4a932002-09-12 15:00:57 +0000114 if self._o != None:
115 libxml2mod.xmlOutputBufferClose(self._o)
116 self._o = None
117
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000118#
119# Example of a class to handle SAX events
120#
121class SAXCallback:
122 """Base class for SAX handlers"""
123 def startDocument(self):
124 """called at the start of the document"""
125 pass
126
127 def endDocument(self):
128 """called at the end of the document"""
129 pass
130
131 def startElement(self, tag, attrs):
132 """called at the start of every element, tag is the name of
William M. Brack1d75c8a2003-10-27 13:48:16 +0000133 the element, attrs is a dictionary of the element's attributes"""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000134 pass
135
136 def endElement(self, tag):
137 """called at the start of every element, tag is the name of
William M. Brack1d75c8a2003-10-27 13:48:16 +0000138 the element"""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000139 pass
140
141 def characters(self, data):
142 """called when character data have been read, data is the string
William M. Brack1d75c8a2003-10-27 13:48:16 +0000143 containing the data, multiple consecutive characters() callback
144 are possible."""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000145 pass
146
147 def cdataBlock(self, data):
148 """called when CDATA section have been read, data is the string
William M. Brack1d75c8a2003-10-27 13:48:16 +0000149 containing the data, multiple consecutive cdataBlock() callback
150 are possible."""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000151 pass
152
153 def reference(self, name):
154 """called when an entity reference has been found"""
155 pass
156
157 def ignorableWhitespace(self, data):
158 """called when potentially ignorable white spaces have been found"""
159 pass
160
161 def processingInstruction(self, target, data):
162 """called when a PI has been found, target contains the PI name and
William M. Brack1d75c8a2003-10-27 13:48:16 +0000163 data is the associated data in the PI"""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000164 pass
165
166 def comment(self, content):
167 """called when a comment has been found, content contains the comment"""
168 pass
169
170 def externalSubset(self, name, externalID, systemID):
171 """called when a DOCTYPE declaration has been found, name is the
William M. Brack1d75c8a2003-10-27 13:48:16 +0000172 DTD name and externalID, systemID are the DTD public and system
173 identifier for that DTd if available"""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000174 pass
175
176 def internalSubset(self, name, externalID, systemID):
177 """called when a DOCTYPE declaration has been found, name is the
William M. Brack1d75c8a2003-10-27 13:48:16 +0000178 DTD name and externalID, systemID are the DTD public and system
179 identifier for that DTD if available"""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000180 pass
181
182 def entityDecl(self, name, type, externalID, systemID, content):
183 """called when an ENTITY declaration has been found, name is the
William M. Brack1d75c8a2003-10-27 13:48:16 +0000184 entity name and externalID, systemID are the entity public and
185 system identifier for that entity if available, type indicates
186 the entity type, and content reports it's string content"""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000187 pass
188
189 def notationDecl(self, name, externalID, systemID):
190 """called when an NOTATION declaration has been found, name is the
William M. Brack1d75c8a2003-10-27 13:48:16 +0000191 notation name and externalID, systemID are the notation public and
192 system identifier for that notation if available"""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000193 pass
194
195 def attributeDecl(self, elem, name, type, defi, defaultValue, nameList):
196 """called when an ATTRIBUTE definition has been found"""
William M. Brack1d75c8a2003-10-27 13:48:16 +0000197 pass
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000198
199 def elementDecl(self, name, type, content):
200 """called when an ELEMENT definition has been found"""
William M. Brack1d75c8a2003-10-27 13:48:16 +0000201 pass
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000202
203 def entityDecl(self, name, publicId, systemID, notationName):
204 """called when an unparsed ENTITY declaration has been found,
William M. Brack1d75c8a2003-10-27 13:48:16 +0000205 name is the entity name and publicId,, systemID are the entity
206 public and system identifier for that entity if available,
207 and notationName indicate the associated NOTATION"""
Daniel Veillard8d24cc12002-03-05 15:41:29 +0000208 pass
209
210 def warning(self, msg):
211 print msg
212
213 def error(self, msg):
214 raise parserError(msg)
215
216 def fatalError(self, msg):
217 raise parserError(msg)
218
219#
Daniel Veillard1971ee22002-01-31 20:29:19 +0000220# This class is the ancestor of all the Node classes. It provides
221# the basic functionalities shared by all nodes (and handle
222# gracefylly the exception), like name, navigation in the tree,
Daniel Veillard1e774382002-03-06 17:35:40 +0000223# doc reference, content access and serializing to a string or URI
Daniel Veillard1971ee22002-01-31 20:29:19 +0000224#
Daniel Veillard36ed5292002-01-30 23:49:06 +0000225class xmlCore:
Daniel Veillardd2897fd2002-01-30 16:37:32 +0000226 def __init__(self, _obj=None):
227 if _obj != None:
Daniel Veillard01a6d412002-02-11 18:42:20 +0000228 self._o = _obj;
229 return
230 self._o = None
Daniel Veillardd2897fd2002-01-30 16:37:32 +0000231 def get_parent(self):
Daniel Veillard01a6d412002-02-11 18:42:20 +0000232 ret = libxml2mod.parent(self._o)
233 if ret == None:
234 return None
235 return xmlNode(_obj=ret)
Daniel Veillardd2897fd2002-01-30 16:37:32 +0000236 def get_children(self):
Daniel Veillard01a6d412002-02-11 18:42:20 +0000237 ret = libxml2mod.children(self._o)
238 if ret == None:
239 return None
240 return xmlNode(_obj=ret)
Daniel Veillardd2897fd2002-01-30 16:37:32 +0000241 def get_last(self):
Daniel Veillard01a6d412002-02-11 18:42:20 +0000242 ret = libxml2mod.last(self._o)
243 if ret == None:
244 return None
245 return xmlNode(_obj=ret)
Daniel Veillardd2897fd2002-01-30 16:37:32 +0000246 def get_next(self):
Daniel Veillard01a6d412002-02-11 18:42:20 +0000247 ret = libxml2mod.next(self._o)
248 if ret == None:
249 return None
250 return xmlNode(_obj=ret)
Daniel Veillard1971ee22002-01-31 20:29:19 +0000251 def get_properties(self):
Daniel Veillard01a6d412002-02-11 18:42:20 +0000252 ret = libxml2mod.properties(self._o)
253 if ret == None:
254 return None
255 return xmlAttr(_obj=ret)
Daniel Veillardd2897fd2002-01-30 16:37:32 +0000256 def get_prev(self):
Daniel Veillard01a6d412002-02-11 18:42:20 +0000257 ret = libxml2mod.prev(self._o)
258 if ret == None:
259 return None
260 return xmlNode(_obj=ret)
Daniel Veillardd2897fd2002-01-30 16:37:32 +0000261 def get_content(self):
Daniel Veillard01a6d412002-02-11 18:42:20 +0000262 return libxml2mod.xmlNodeGetContent(self._o)
Daniel Veillard51a447a2003-01-04 19:42:46 +0000263 getContent = get_content # why is this duplicate naming needed ?
Daniel Veillardd2897fd2002-01-30 16:37:32 +0000264 def get_name(self):
Daniel Veillard01a6d412002-02-11 18:42:20 +0000265 return libxml2mod.name(self._o)
Daniel Veillardd2897fd2002-01-30 16:37:32 +0000266 def get_type(self):
Daniel Veillard01a6d412002-02-11 18:42:20 +0000267 return libxml2mod.type(self._o)
Daniel Veillard51a447a2003-01-04 19:42:46 +0000268 def get_doc(self):
269 ret = libxml2mod.doc(self._o)
270 if ret == None:
271 if self.type in ["document_xml", "document_html"]:
272 return xmlDoc(_obj=self._o)
273 else:
274 return None
275 return xmlDoc(_obj=ret)
276 #
277 # Those are common attributes to nearly all type of nodes
278 # defined as python2 properties
279 #
280 import sys
281 if float(sys.version[0:3]) < 2.2:
William M. Brack1d75c8a2003-10-27 13:48:16 +0000282 def __getattr__(self, attr):
283 if attr == "parent":
284 ret = libxml2mod.parent(self._o)
285 if ret == None:
286 return None
287 return xmlNode(_obj=ret)
288 elif attr == "properties":
289 ret = libxml2mod.properties(self._o)
290 if ret == None:
291 return None
292 return xmlAttr(_obj=ret)
293 elif attr == "children":
294 ret = libxml2mod.children(self._o)
295 if ret == None:
296 return None
297 return xmlNode(_obj=ret)
298 elif attr == "last":
299 ret = libxml2mod.last(self._o)
300 if ret == None:
301 return None
302 return xmlNode(_obj=ret)
303 elif attr == "next":
304 ret = libxml2mod.next(self._o)
305 if ret == None:
306 return None
307 return xmlNode(_obj=ret)
308 elif attr == "prev":
309 ret = libxml2mod.prev(self._o)
310 if ret == None:
311 return None
312 return xmlNode(_obj=ret)
313 elif attr == "content":
314 return libxml2mod.xmlNodeGetContent(self._o)
315 elif attr == "name":
316 return libxml2mod.name(self._o)
317 elif attr == "type":
318 return libxml2mod.type(self._o)
319 elif attr == "doc":
320 ret = libxml2mod.doc(self._o)
321 if ret == None:
322 if self.type == "document_xml" or self.type == "document_html":
323 return xmlDoc(_obj=self._o)
324 else:
325 return None
326 return xmlDoc(_obj=ret)
327 raise AttributeError,attr
Daniel Veillard51a447a2003-01-04 19:42:46 +0000328 else:
William M. Brack1d75c8a2003-10-27 13:48:16 +0000329 parent = property(get_parent, None, None, "Parent node")
330 children = property(get_children, None, None, "First child node")
331 last = property(get_last, None, None, "Last sibling node")
332 next = property(get_next, None, None, "Next sibling node")
333 prev = property(get_prev, None, None, "Previous sibling node")
334 properties = property(get_properties, None, None, "List of properies")
335 content = property(get_content, None, None, "Content of this node")
336 name = property(get_name, None, None, "Node name")
337 type = property(get_type, None, None, "Node type")
338 doc = property(get_doc, None, None, "The document this node belongs to")
Daniel Veillard1e774382002-03-06 17:35:40 +0000339
340 #
341 # Serialization routines, the optional arguments have the following
342 # meaning:
343 # encoding: string to ask saving in a specific encoding
Daniel Veillard51a447a2003-01-04 19:42:46 +0000344 # indent: if 1 the serializer is asked to indent the output
Daniel Veillard1e774382002-03-06 17:35:40 +0000345 #
346 def serialize(self, encoding = None, format = 0):
347 return libxml2mod.serializeNode(self._o, encoding, format)
348 def saveTo(self, file, encoding = None, format = 0):
349 return libxml2mod.saveNodeTo(self._o, file, encoding, format)
Daniel Veillard01a6d412002-02-11 18:42:20 +0000350
Daniel Veillardf742d342002-03-07 00:05:35 +0000351 #
352 # Selecting nodes using XPath, a bit slow because the context
353 # is allocated/freed every time but convenient.
354 #
355 def xpathEval(self, expr):
William M. Brack1d75c8a2003-10-27 13:48:16 +0000356 doc = self.doc
357 if doc == None:
358 return None
359 ctxt = doc.xpathNewContext()
360 ctxt.setContextNode(self)
361 res = ctxt.xpathEval(expr)
362 ctxt.xpathFreeContext()
363 return res
Daniel Veillard51a447a2003-01-04 19:42:46 +0000364
365 #
366 # Selecting nodes using XPath, faster because the context
367 # is allocated just once per xmlDoc.
368 #
369 def xpathEval2(self, expr):
William M. Brack1d75c8a2003-10-27 13:48:16 +0000370 doc = self.doc
371 if doc == None:
372 return None
Daniel Veillard51a447a2003-01-04 19:42:46 +0000373 try:
374 doc._ctxt.setContextNode(self)
375 except:
376 doc._ctxt = doc.xpathNewContext()
377 doc._ctxt.setContextNode(self)
William M. Brack1d75c8a2003-10-27 13:48:16 +0000378 res = doc._ctxt.xpathEval(expr)
379 return res
Daniel Veillard51a447a2003-01-04 19:42:46 +0000380
381 # support for python2 iterators
382 def walk_depth_first(self):
383 return xmlCoreDepthFirstItertor(self)
384 def walk_breadth_first(self):
385 return xmlCoreBreadthFirstItertor(self)
386 __iter__ = walk_depth_first
387
388 def free(self):
389 try:
390 self.doc._ctxt.xpathFreeContext()
391 except:
392 pass
393 libxml2mod.freeDoc(self._o)
394
395
396#
397# implements the depth-first iterator for libxml2 DOM tree
398#
399class xmlCoreDepthFirstItertor:
400 def __init__(self, node):
401 self.node = node
402 self.parents = []
403 def __iter__(self):
404 return self
405 def next(self):
406 while 1:
407 if self.node:
408 ret = self.node
409 self.parents.append(self.node)
410 self.node = self.node.children
411 return ret
412 try:
413 parent = self.parents.pop()
414 except IndexError:
415 raise StopIteration
416 self.node = parent.next
417
418#
419# implements the breadth-first iterator for libxml2 DOM tree
420#
421class xmlCoreBreadthFirstItertor:
422 def __init__(self, node):
423 self.node = node
424 self.parents = []
425 def __iter__(self):
426 return self
427 def next(self):
428 while 1:
429 if self.node:
430 ret = self.node
431 self.parents.append(self.node)
432 self.node = self.node.next
433 return ret
434 try:
435 parent = self.parents.pop()
436 except IndexError:
437 raise StopIteration
438 self.node = parent.children
439
Daniel Veillard36ed5292002-01-30 23:49:06 +0000440#
Daniel Veillard1971ee22002-01-31 20:29:19 +0000441# converters to present a nicer view of the XPath returns
442#
443def nodeWrap(o):
444 # TODO try to cast to the most appropriate node class
Daniel Veillard5e5c2d02002-02-09 18:03:01 +0000445 name = libxml2mod.name(o)
Daniel Veillard1971ee22002-01-31 20:29:19 +0000446 if name == "element" or name == "text":
447 return xmlNode(_obj=o)
448 if name == "attribute":
449 return xmlAttr(_obj=o)
450 if name[0:8] == "document":
451 return xmlDoc(_obj=o)
452 if name[0:8] == "namespace":
453 return xmlNs(_obj=o)
454 if name == "elem_decl":
455 return xmlElement(_obj=o)
456 if name == "attribute_decl":
457 return xmlAtribute(_obj=o)
458 if name == "entity_decl":
459 return xmlEntity(_obj=o)
460 if name == "dtd":
Daniel Veillarde59494f2003-01-04 16:35:29 +0000461 return xmlDtd(_obj=o)
Daniel Veillard1971ee22002-01-31 20:29:19 +0000462 return xmlNode(_obj=o)
463
464def xpathObjectRet(o):
465 if type(o) == type([]) or type(o) == type(()):
466 ret = map(lambda x: nodeWrap(x), o)
Daniel Veillard01a6d412002-02-11 18:42:20 +0000467 return ret
Daniel Veillard1971ee22002-01-31 20:29:19 +0000468 return o
469
470#
Daniel Veillarda7340c82002-02-01 17:56:45 +0000471# register an XPath function
472#
473def registerXPathFunction(ctxt, name, ns_uri, f):
Daniel Veillard5e5c2d02002-02-09 18:03:01 +0000474 ret = libxml2mod.xmlRegisterXPathFunction(ctxt, name, ns_uri, f)
Daniel Veillarda7340c82002-02-01 17:56:45 +0000475
476#
Daniel Veillardf25b4ca2002-12-27 15:18:35 +0000477# For the xmlTextReader parser configuration
478#
479PARSER_LOADDTD=1
480PARSER_DEFAULTATTRS=2
481PARSER_VALIDATE=3
Daniel Veillarde18fc182002-12-28 22:56:33 +0000482PARSER_SUBST_ENTITIES=4
Daniel Veillardf25b4ca2002-12-27 15:18:35 +0000483
484#
Daniel Veillard417be3a2003-01-20 21:26:34 +0000485# For the error callback severities
Daniel Veillard26f70262003-01-16 22:45:08 +0000486#
Daniel Veillard417be3a2003-01-20 21:26:34 +0000487PARSER_SEVERITY_VALIDITY_WARNING=1
488PARSER_SEVERITY_VALIDITY_ERROR=2
489PARSER_SEVERITY_WARNING=3
490PARSER_SEVERITY_ERROR=4
Daniel Veillard26f70262003-01-16 22:45:08 +0000491
492#
Daniel Veillard3e20a292003-01-10 13:14:40 +0000493# register the libxml2 error handler
Daniel Veillard36ed5292002-01-30 23:49:06 +0000494#
Daniel Veillard3e20a292003-01-10 13:14:40 +0000495def registerErrorHandler(f, ctx):
496 """Register a Python written function to for error reporting.
497 The function is called back as f(ctx, error). """
498 import sys
499 if not sys.modules.has_key('libxslt'):
500 # normal behaviour when libxslt is not imported
501 ret = libxml2mod.xmlRegisterErrorHandler(f,ctx)
502 else:
503 # when libxslt is already imported, one must
504 # use libxst's error handler instead
505 import libxslt
506 ret = libxslt.registerErrorHandler(f,ctx)
507 return ret
508
Daniel Veillarde6227e02003-01-14 11:42:39 +0000509class parserCtxtCore:
510
511 def __init__(self, _obj=None):
512 if _obj != None:
513 self._o = _obj;
514 return
515 self._o = None
516
517 def __del__(self):
518 if self._o != None:
519 libxml2mod.xmlFreeParserCtxt(self._o)
William M. Brack1d75c8a2003-10-27 13:48:16 +0000520 self._o = None
Daniel Veillarde6227e02003-01-14 11:42:39 +0000521
Daniel Veillard417be3a2003-01-20 21:26:34 +0000522 def setErrorHandler(self,f,arg):
523 """Register an error handler that will be called back as
524 f(arg,msg,severity,reserved).
525
526 @reserved is currently always None."""
527 libxml2mod.xmlParserCtxtSetErrorHandler(self._o,f,arg)
Daniel Veillarde6227e02003-01-14 11:42:39 +0000528
Daniel Veillard417be3a2003-01-20 21:26:34 +0000529 def getErrorHandler(self):
530 """Return (f,arg) as previously registered with setErrorHandler
531 or (None,None)."""
532 return libxml2mod.xmlParserCtxtGetErrorHandler(self._o)
533
Daniel Veillard54396242003-04-23 07:36:50 +0000534 def addLocalCatalog(self, uri):
535 """Register a local catalog with the parser"""
536 return libxml2mod.addLocalCatalog(self._o, uri)
537
538
Daniel Veillard417be3a2003-01-20 21:26:34 +0000539def _xmlTextReaderErrorFunc((f,arg),msg,severity,locator):
540 """Intermediate callback to wrap the locator"""
541 return f(arg,msg,severity,xmlTextReaderLocator(locator))
Daniel Veillarde6227e02003-01-14 11:42:39 +0000542
Daniel Veillard26f70262003-01-16 22:45:08 +0000543class xmlTextReaderCore:
544
545 def __init__(self, _obj=None):
546 self.input = None
547 if _obj != None:self._o = _obj;return
548 self._o = None
549
550 def __del__(self):
551 if self._o != None:
552 libxml2mod.xmlFreeTextReader(self._o)
553 self._o = None
554
Daniel Veillard417be3a2003-01-20 21:26:34 +0000555 def SetErrorHandler(self,f,arg):
Daniel Veillard26f70262003-01-16 22:45:08 +0000556 """Register an error handler that will be called back as
Daniel Veillard417be3a2003-01-20 21:26:34 +0000557 f(arg,msg,severity,locator)."""
558 if f is None:
559 libxml2mod.xmlTextReaderSetErrorHandler(\
560 self._o,None,None)
561 else:
562 libxml2mod.xmlTextReaderSetErrorHandler(\
563 self._o,_xmlTextReaderErrorFunc,(f,arg))
Daniel Veillard26f70262003-01-16 22:45:08 +0000564
Daniel Veillard417be3a2003-01-20 21:26:34 +0000565 def GetErrorHandler(self):
Daniel Veillard26f70262003-01-16 22:45:08 +0000566 """Return (f,arg) as previously registered with setErrorHandler
567 or (None,None)."""
Daniel Veillard417be3a2003-01-20 21:26:34 +0000568 f,arg = libxml2mod.xmlTextReaderGetErrorHandler(self._o)
569 if f is None:
570 return None,None
571 else:
572 # assert f is _xmlTextReaderErrorFunc
573 return arg
Daniel Veillard26f70262003-01-16 22:45:08 +0000574
Daniel Veillard3e20a292003-01-10 13:14:40 +0000575# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
576#
577# Everything before this line comes from libxml.py
578# Everything after this line is automatically generated
579#
580# WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
Daniel Veillard1971ee22002-01-31 20:29:19 +0000581