Annotation of embedaddon/libxml2/python/libxml.py, revision 1.1
1.1 ! misho 1: import libxml2mod
! 2: import types
! 3: import sys
! 4:
! 5: # The root of all libxml2 errors.
! 6: class libxmlError(Exception): pass
! 7:
! 8: #
! 9: # id() is sometimes negative ...
! 10: #
! 11: def pos_id(o):
! 12: i = id(o)
! 13: if (i < 0):
! 14: return (sys.maxint - i)
! 15: return i
! 16:
! 17: #
! 18: # Errors raised by the wrappers when some tree handling failed.
! 19: #
! 20: class treeError(libxmlError):
! 21: def __init__(self, msg):
! 22: self.msg = msg
! 23: def __str__(self):
! 24: return self.msg
! 25:
! 26: class parserError(libxmlError):
! 27: def __init__(self, msg):
! 28: self.msg = msg
! 29: def __str__(self):
! 30: return self.msg
! 31:
! 32: class uriError(libxmlError):
! 33: def __init__(self, msg):
! 34: self.msg = msg
! 35: def __str__(self):
! 36: return self.msg
! 37:
! 38: class xpathError(libxmlError):
! 39: def __init__(self, msg):
! 40: self.msg = msg
! 41: def __str__(self):
! 42: return self.msg
! 43:
! 44: class ioWrapper:
! 45: def __init__(self, _obj):
! 46: self.__io = _obj
! 47: self._o = None
! 48:
! 49: def io_close(self):
! 50: if self.__io == None:
! 51: return(-1)
! 52: self.__io.close()
! 53: self.__io = None
! 54: return(0)
! 55:
! 56: def io_flush(self):
! 57: if self.__io == None:
! 58: return(-1)
! 59: self.__io.flush()
! 60: return(0)
! 61:
! 62: def io_read(self, len = -1):
! 63: if self.__io == None:
! 64: return(-1)
! 65: if len < 0:
! 66: return(self.__io.read())
! 67: return(self.__io.read(len))
! 68:
! 69: def io_write(self, str, len = -1):
! 70: if self.__io == None:
! 71: return(-1)
! 72: if len < 0:
! 73: return(self.__io.write(str))
! 74: return(self.__io.write(str, len))
! 75:
! 76: class ioReadWrapper(ioWrapper):
! 77: def __init__(self, _obj, enc = ""):
! 78: ioWrapper.__init__(self, _obj)
! 79: self._o = libxml2mod.xmlCreateInputBuffer(self, enc)
! 80:
! 81: def __del__(self):
! 82: print "__del__"
! 83: self.io_close()
! 84: if self._o != None:
! 85: libxml2mod.xmlFreeParserInputBuffer(self._o)
! 86: self._o = None
! 87:
! 88: def close(self):
! 89: self.io_close()
! 90: if self._o != None:
! 91: libxml2mod.xmlFreeParserInputBuffer(self._o)
! 92: self._o = None
! 93:
! 94: class ioWriteWrapper(ioWrapper):
! 95: def __init__(self, _obj, enc = ""):
! 96: # print "ioWriteWrapper.__init__", _obj
! 97: if type(_obj) == type(''):
! 98: print "write io from a string"
! 99: self.o = None
! 100: elif type(_obj) == types.InstanceType:
! 101: print "write io from instance of %s" % (_obj.__class__)
! 102: ioWrapper.__init__(self, _obj)
! 103: self._o = libxml2mod.xmlCreateOutputBuffer(self, enc)
! 104: else:
! 105: file = libxml2mod.outputBufferGetPythonFile(_obj)
! 106: if file != None:
! 107: ioWrapper.__init__(self, file)
! 108: else:
! 109: ioWrapper.__init__(self, _obj)
! 110: self._o = _obj
! 111:
! 112: def __del__(self):
! 113: # print "__del__"
! 114: self.io_close()
! 115: if self._o != None:
! 116: libxml2mod.xmlOutputBufferClose(self._o)
! 117: self._o = None
! 118:
! 119: def flush(self):
! 120: self.io_flush()
! 121: if self._o != None:
! 122: libxml2mod.xmlOutputBufferClose(self._o)
! 123: self._o = None
! 124:
! 125: def close(self):
! 126: self.io_flush()
! 127: if self._o != None:
! 128: libxml2mod.xmlOutputBufferClose(self._o)
! 129: self._o = None
! 130:
! 131: #
! 132: # Example of a class to handle SAX events
! 133: #
! 134: class SAXCallback:
! 135: """Base class for SAX handlers"""
! 136: def startDocument(self):
! 137: """called at the start of the document"""
! 138: pass
! 139:
! 140: def endDocument(self):
! 141: """called at the end of the document"""
! 142: pass
! 143:
! 144: def startElement(self, tag, attrs):
! 145: """called at the start of every element, tag is the name of
! 146: the element, attrs is a dictionary of the element's attributes"""
! 147: pass
! 148:
! 149: def endElement(self, tag):
! 150: """called at the start of every element, tag is the name of
! 151: the element"""
! 152: pass
! 153:
! 154: def characters(self, data):
! 155: """called when character data have been read, data is the string
! 156: containing the data, multiple consecutive characters() callback
! 157: are possible."""
! 158: pass
! 159:
! 160: def cdataBlock(self, data):
! 161: """called when CDATA section have been read, data is the string
! 162: containing the data, multiple consecutive cdataBlock() callback
! 163: are possible."""
! 164: pass
! 165:
! 166: def reference(self, name):
! 167: """called when an entity reference has been found"""
! 168: pass
! 169:
! 170: def ignorableWhitespace(self, data):
! 171: """called when potentially ignorable white spaces have been found"""
! 172: pass
! 173:
! 174: def processingInstruction(self, target, data):
! 175: """called when a PI has been found, target contains the PI name and
! 176: data is the associated data in the PI"""
! 177: pass
! 178:
! 179: def comment(self, content):
! 180: """called when a comment has been found, content contains the comment"""
! 181: pass
! 182:
! 183: def externalSubset(self, name, externalID, systemID):
! 184: """called when a DOCTYPE declaration has been found, name is the
! 185: DTD name and externalID, systemID are the DTD public and system
! 186: identifier for that DTd if available"""
! 187: pass
! 188:
! 189: def internalSubset(self, name, externalID, systemID):
! 190: """called when a DOCTYPE declaration has been found, name is the
! 191: DTD name and externalID, systemID are the DTD public and system
! 192: identifier for that DTD if available"""
! 193: pass
! 194:
! 195: def entityDecl(self, name, type, externalID, systemID, content):
! 196: """called when an ENTITY declaration has been found, name is the
! 197: entity name and externalID, systemID are the entity public and
! 198: system identifier for that entity if available, type indicates
! 199: the entity type, and content reports it's string content"""
! 200: pass
! 201:
! 202: def notationDecl(self, name, externalID, systemID):
! 203: """called when an NOTATION declaration has been found, name is the
! 204: notation name and externalID, systemID are the notation public and
! 205: system identifier for that notation if available"""
! 206: pass
! 207:
! 208: def attributeDecl(self, elem, name, type, defi, defaultValue, nameList):
! 209: """called when an ATTRIBUTE definition has been found"""
! 210: pass
! 211:
! 212: def elementDecl(self, name, type, content):
! 213: """called when an ELEMENT definition has been found"""
! 214: pass
! 215:
! 216: def entityDecl(self, name, publicId, systemID, notationName):
! 217: """called when an unparsed ENTITY declaration has been found,
! 218: name is the entity name and publicId,, systemID are the entity
! 219: public and system identifier for that entity if available,
! 220: and notationName indicate the associated NOTATION"""
! 221: pass
! 222:
! 223: def warning(self, msg):
! 224: #print msg
! 225: pass
! 226:
! 227: def error(self, msg):
! 228: raise parserError(msg)
! 229:
! 230: def fatalError(self, msg):
! 231: raise parserError(msg)
! 232:
! 233: #
! 234: # This class is the ancestor of all the Node classes. It provides
! 235: # the basic functionalities shared by all nodes (and handle
! 236: # gracefylly the exception), like name, navigation in the tree,
! 237: # doc reference, content access and serializing to a string or URI
! 238: #
! 239: class xmlCore:
! 240: def __init__(self, _obj=None):
! 241: if _obj != None:
! 242: self._o = _obj;
! 243: return
! 244: self._o = None
! 245:
! 246: def __eq__(self, other):
! 247: if other == None:
! 248: return False
! 249: ret = libxml2mod.compareNodesEqual(self._o, other._o)
! 250: if ret == None:
! 251: return False
! 252: return ret == True
! 253: def __ne__(self, other):
! 254: if other == None:
! 255: return True
! 256: ret = libxml2mod.compareNodesEqual(self._o, other._o)
! 257: return not ret
! 258: def __hash__(self):
! 259: ret = libxml2mod.nodeHash(self._o)
! 260: return ret
! 261:
! 262: def __str__(self):
! 263: return self.serialize()
! 264: def get_parent(self):
! 265: ret = libxml2mod.parent(self._o)
! 266: if ret == None:
! 267: return None
! 268: return xmlNode(_obj=ret)
! 269: def get_children(self):
! 270: ret = libxml2mod.children(self._o)
! 271: if ret == None:
! 272: return None
! 273: return xmlNode(_obj=ret)
! 274: def get_last(self):
! 275: ret = libxml2mod.last(self._o)
! 276: if ret == None:
! 277: return None
! 278: return xmlNode(_obj=ret)
! 279: def get_next(self):
! 280: ret = libxml2mod.next(self._o)
! 281: if ret == None:
! 282: return None
! 283: return xmlNode(_obj=ret)
! 284: def get_properties(self):
! 285: ret = libxml2mod.properties(self._o)
! 286: if ret == None:
! 287: return None
! 288: return xmlAttr(_obj=ret)
! 289: def get_prev(self):
! 290: ret = libxml2mod.prev(self._o)
! 291: if ret == None:
! 292: return None
! 293: return xmlNode(_obj=ret)
! 294: def get_content(self):
! 295: return libxml2mod.xmlNodeGetContent(self._o)
! 296: getContent = get_content # why is this duplicate naming needed ?
! 297: def get_name(self):
! 298: return libxml2mod.name(self._o)
! 299: def get_type(self):
! 300: return libxml2mod.type(self._o)
! 301: def get_doc(self):
! 302: ret = libxml2mod.doc(self._o)
! 303: if ret == None:
! 304: if self.type in ["document_xml", "document_html"]:
! 305: return xmlDoc(_obj=self._o)
! 306: else:
! 307: return None
! 308: return xmlDoc(_obj=ret)
! 309: #
! 310: # Those are common attributes to nearly all type of nodes
! 311: # defined as python2 properties
! 312: #
! 313: import sys
! 314: if float(sys.version[0:3]) < 2.2:
! 315: def __getattr__(self, attr):
! 316: if attr == "parent":
! 317: ret = libxml2mod.parent(self._o)
! 318: if ret == None:
! 319: return None
! 320: return xmlNode(_obj=ret)
! 321: elif attr == "properties":
! 322: ret = libxml2mod.properties(self._o)
! 323: if ret == None:
! 324: return None
! 325: return xmlAttr(_obj=ret)
! 326: elif attr == "children":
! 327: ret = libxml2mod.children(self._o)
! 328: if ret == None:
! 329: return None
! 330: return xmlNode(_obj=ret)
! 331: elif attr == "last":
! 332: ret = libxml2mod.last(self._o)
! 333: if ret == None:
! 334: return None
! 335: return xmlNode(_obj=ret)
! 336: elif attr == "next":
! 337: ret = libxml2mod.next(self._o)
! 338: if ret == None:
! 339: return None
! 340: return xmlNode(_obj=ret)
! 341: elif attr == "prev":
! 342: ret = libxml2mod.prev(self._o)
! 343: if ret == None:
! 344: return None
! 345: return xmlNode(_obj=ret)
! 346: elif attr == "content":
! 347: return libxml2mod.xmlNodeGetContent(self._o)
! 348: elif attr == "name":
! 349: return libxml2mod.name(self._o)
! 350: elif attr == "type":
! 351: return libxml2mod.type(self._o)
! 352: elif attr == "doc":
! 353: ret = libxml2mod.doc(self._o)
! 354: if ret == None:
! 355: if self.type == "document_xml" or self.type == "document_html":
! 356: return xmlDoc(_obj=self._o)
! 357: else:
! 358: return None
! 359: return xmlDoc(_obj=ret)
! 360: raise AttributeError,attr
! 361: else:
! 362: parent = property(get_parent, None, None, "Parent node")
! 363: children = property(get_children, None, None, "First child node")
! 364: last = property(get_last, None, None, "Last sibling node")
! 365: next = property(get_next, None, None, "Next sibling node")
! 366: prev = property(get_prev, None, None, "Previous sibling node")
! 367: properties = property(get_properties, None, None, "List of properies")
! 368: content = property(get_content, None, None, "Content of this node")
! 369: name = property(get_name, None, None, "Node name")
! 370: type = property(get_type, None, None, "Node type")
! 371: doc = property(get_doc, None, None, "The document this node belongs to")
! 372:
! 373: #
! 374: # Serialization routines, the optional arguments have the following
! 375: # meaning:
! 376: # encoding: string to ask saving in a specific encoding
! 377: # indent: if 1 the serializer is asked to indent the output
! 378: #
! 379: def serialize(self, encoding = None, format = 0):
! 380: return libxml2mod.serializeNode(self._o, encoding, format)
! 381: def saveTo(self, file, encoding = None, format = 0):
! 382: return libxml2mod.saveNodeTo(self._o, file, encoding, format)
! 383:
! 384: #
! 385: # Canonicalization routines:
! 386: #
! 387: # nodes: the node set (tuple or list) to be included in the
! 388: # canonized image or None if all document nodes should be
! 389: # included.
! 390: # exclusive: the exclusive flag (0 - non-exclusive
! 391: # canonicalization; otherwise - exclusive canonicalization)
! 392: # prefixes: the list of inclusive namespace prefixes (strings),
! 393: # or None if there is no inclusive namespaces (only for
! 394: # exclusive canonicalization, ignored otherwise)
! 395: # with_comments: include comments in the result (!=0) or not
! 396: # (==0)
! 397: def c14nMemory(self,
! 398: nodes=None,
! 399: exclusive=0,
! 400: prefixes=None,
! 401: with_comments=0):
! 402: if nodes:
! 403: nodes = map(lambda n: n._o, nodes)
! 404: return libxml2mod.xmlC14NDocDumpMemory(
! 405: self.get_doc()._o,
! 406: nodes,
! 407: exclusive != 0,
! 408: prefixes,
! 409: with_comments != 0)
! 410: def c14nSaveTo(self,
! 411: file,
! 412: nodes=None,
! 413: exclusive=0,
! 414: prefixes=None,
! 415: with_comments=0):
! 416: if nodes:
! 417: nodes = map(lambda n: n._o, nodes)
! 418: return libxml2mod.xmlC14NDocSaveTo(
! 419: self.get_doc()._o,
! 420: nodes,
! 421: exclusive != 0,
! 422: prefixes,
! 423: with_comments != 0,
! 424: file)
! 425:
! 426: #
! 427: # Selecting nodes using XPath, a bit slow because the context
! 428: # is allocated/freed every time but convenient.
! 429: #
! 430: def xpathEval(self, expr):
! 431: doc = self.doc
! 432: if doc == None:
! 433: return None
! 434: ctxt = doc.xpathNewContext()
! 435: ctxt.setContextNode(self)
! 436: res = ctxt.xpathEval(expr)
! 437: ctxt.xpathFreeContext()
! 438: return res
! 439:
! 440: # #
! 441: # # Selecting nodes using XPath, faster because the context
! 442: # # is allocated just once per xmlDoc.
! 443: # #
! 444: # # Removed: DV memleaks c.f. #126735
! 445: # #
! 446: # def xpathEval2(self, expr):
! 447: # doc = self.doc
! 448: # if doc == None:
! 449: # return None
! 450: # try:
! 451: # doc._ctxt.setContextNode(self)
! 452: # except:
! 453: # doc._ctxt = doc.xpathNewContext()
! 454: # doc._ctxt.setContextNode(self)
! 455: # res = doc._ctxt.xpathEval(expr)
! 456: # return res
! 457: def xpathEval2(self, expr):
! 458: return self.xpathEval(expr)
! 459:
! 460: # Remove namespaces
! 461: def removeNsDef(self, href):
! 462: """
! 463: Remove a namespace definition from a node. If href is None,
! 464: remove all of the ns definitions on that node. The removed
! 465: namespaces are returned as a linked list.
! 466:
! 467: Note: If any child nodes referred to the removed namespaces,
! 468: they will be left with dangling links. You should call
! 469: renconciliateNs() to fix those pointers.
! 470:
! 471: Note: This method does not free memory taken by the ns
! 472: definitions. You will need to free it manually with the
! 473: freeNsList() method on the returns xmlNs object.
! 474: """
! 475:
! 476: ret = libxml2mod.xmlNodeRemoveNsDef(self._o, href)
! 477: if ret is None:return None
! 478: __tmp = xmlNs(_obj=ret)
! 479: return __tmp
! 480:
! 481: # support for python2 iterators
! 482: def walk_depth_first(self):
! 483: return xmlCoreDepthFirstItertor(self)
! 484: def walk_breadth_first(self):
! 485: return xmlCoreBreadthFirstItertor(self)
! 486: __iter__ = walk_depth_first
! 487:
! 488: def free(self):
! 489: try:
! 490: self.doc._ctxt.xpathFreeContext()
! 491: except:
! 492: pass
! 493: libxml2mod.xmlFreeDoc(self._o)
! 494:
! 495:
! 496: #
! 497: # implements the depth-first iterator for libxml2 DOM tree
! 498: #
! 499: class xmlCoreDepthFirstItertor:
! 500: def __init__(self, node):
! 501: self.node = node
! 502: self.parents = []
! 503: def __iter__(self):
! 504: return self
! 505: def next(self):
! 506: while 1:
! 507: if self.node:
! 508: ret = self.node
! 509: self.parents.append(self.node)
! 510: self.node = self.node.children
! 511: return ret
! 512: try:
! 513: parent = self.parents.pop()
! 514: except IndexError:
! 515: raise StopIteration
! 516: self.node = parent.next
! 517:
! 518: #
! 519: # implements the breadth-first iterator for libxml2 DOM tree
! 520: #
! 521: class xmlCoreBreadthFirstItertor:
! 522: def __init__(self, node):
! 523: self.node = node
! 524: self.parents = []
! 525: def __iter__(self):
! 526: return self
! 527: def next(self):
! 528: while 1:
! 529: if self.node:
! 530: ret = self.node
! 531: self.parents.append(self.node)
! 532: self.node = self.node.next
! 533: return ret
! 534: try:
! 535: parent = self.parents.pop()
! 536: except IndexError:
! 537: raise StopIteration
! 538: self.node = parent.children
! 539:
! 540: #
! 541: # converters to present a nicer view of the XPath returns
! 542: #
! 543: def nodeWrap(o):
! 544: # TODO try to cast to the most appropriate node class
! 545: name = libxml2mod.type(o)
! 546: if name == "element" or name == "text":
! 547: return xmlNode(_obj=o)
! 548: if name == "attribute":
! 549: return xmlAttr(_obj=o)
! 550: if name[0:8] == "document":
! 551: return xmlDoc(_obj=o)
! 552: if name == "namespace":
! 553: return xmlNs(_obj=o)
! 554: if name == "elem_decl":
! 555: return xmlElement(_obj=o)
! 556: if name == "attribute_decl":
! 557: return xmlAttribute(_obj=o)
! 558: if name == "entity_decl":
! 559: return xmlEntity(_obj=o)
! 560: if name == "dtd":
! 561: return xmlDtd(_obj=o)
! 562: return xmlNode(_obj=o)
! 563:
! 564: def xpathObjectRet(o):
! 565: otype = type(o)
! 566: if otype == type([]):
! 567: ret = map(xpathObjectRet, o)
! 568: return ret
! 569: elif otype == type(()):
! 570: ret = map(xpathObjectRet, o)
! 571: return tuple(ret)
! 572: elif otype == type('') or otype == type(0) or otype == type(0.0):
! 573: return o
! 574: else:
! 575: return nodeWrap(o)
! 576:
! 577: #
! 578: # register an XPath function
! 579: #
! 580: def registerXPathFunction(ctxt, name, ns_uri, f):
! 581: ret = libxml2mod.xmlRegisterXPathFunction(ctxt, name, ns_uri, f)
! 582:
! 583: #
! 584: # For the xmlTextReader parser configuration
! 585: #
! 586: PARSER_LOADDTD=1
! 587: PARSER_DEFAULTATTRS=2
! 588: PARSER_VALIDATE=3
! 589: PARSER_SUBST_ENTITIES=4
! 590:
! 591: #
! 592: # For the error callback severities
! 593: #
! 594: PARSER_SEVERITY_VALIDITY_WARNING=1
! 595: PARSER_SEVERITY_VALIDITY_ERROR=2
! 596: PARSER_SEVERITY_WARNING=3
! 597: PARSER_SEVERITY_ERROR=4
! 598:
! 599: #
! 600: # register the libxml2 error handler
! 601: #
! 602: def registerErrorHandler(f, ctx):
! 603: """Register a Python written function to for error reporting.
! 604: The function is called back as f(ctx, error). """
! 605: import sys
! 606: if not sys.modules.has_key('libxslt'):
! 607: # normal behaviour when libxslt is not imported
! 608: ret = libxml2mod.xmlRegisterErrorHandler(f,ctx)
! 609: else:
! 610: # when libxslt is already imported, one must
! 611: # use libxst's error handler instead
! 612: import libxslt
! 613: ret = libxslt.registerErrorHandler(f,ctx)
! 614: return ret
! 615:
! 616: class parserCtxtCore:
! 617:
! 618: def __init__(self, _obj=None):
! 619: if _obj != None:
! 620: self._o = _obj;
! 621: return
! 622: self._o = None
! 623:
! 624: def __del__(self):
! 625: if self._o != None:
! 626: libxml2mod.xmlFreeParserCtxt(self._o)
! 627: self._o = None
! 628:
! 629: def setErrorHandler(self,f,arg):
! 630: """Register an error handler that will be called back as
! 631: f(arg,msg,severity,reserved).
! 632:
! 633: @reserved is currently always None."""
! 634: libxml2mod.xmlParserCtxtSetErrorHandler(self._o,f,arg)
! 635:
! 636: def getErrorHandler(self):
! 637: """Return (f,arg) as previously registered with setErrorHandler
! 638: or (None,None)."""
! 639: return libxml2mod.xmlParserCtxtGetErrorHandler(self._o)
! 640:
! 641: def addLocalCatalog(self, uri):
! 642: """Register a local catalog with the parser"""
! 643: return libxml2mod.addLocalCatalog(self._o, uri)
! 644:
! 645:
! 646: class ValidCtxtCore:
! 647:
! 648: def __init__(self, *args, **kw):
! 649: pass
! 650:
! 651: def setValidityErrorHandler(self, err_func, warn_func, arg=None):
! 652: """
! 653: Register error and warning handlers for DTD validation.
! 654: These will be called back as f(msg,arg)
! 655: """
! 656: libxml2mod.xmlSetValidErrors(self._o, err_func, warn_func, arg)
! 657:
! 658:
! 659: class SchemaValidCtxtCore:
! 660:
! 661: def __init__(self, *args, **kw):
! 662: pass
! 663:
! 664: def setValidityErrorHandler(self, err_func, warn_func, arg=None):
! 665: """
! 666: Register error and warning handlers for Schema validation.
! 667: These will be called back as f(msg,arg)
! 668: """
! 669: libxml2mod.xmlSchemaSetValidErrors(self._o, err_func, warn_func, arg)
! 670:
! 671:
! 672: class relaxNgValidCtxtCore:
! 673:
! 674: def __init__(self, *args, **kw):
! 675: pass
! 676:
! 677: def setValidityErrorHandler(self, err_func, warn_func, arg=None):
! 678: """
! 679: Register error and warning handlers for RelaxNG validation.
! 680: These will be called back as f(msg,arg)
! 681: """
! 682: libxml2mod.xmlRelaxNGSetValidErrors(self._o, err_func, warn_func, arg)
! 683:
! 684:
! 685: def _xmlTextReaderErrorFunc((f,arg),msg,severity,locator):
! 686: """Intermediate callback to wrap the locator"""
! 687: return f(arg,msg,severity,xmlTextReaderLocator(locator))
! 688:
! 689: class xmlTextReaderCore:
! 690:
! 691: def __init__(self, _obj=None):
! 692: self.input = None
! 693: if _obj != None:self._o = _obj;return
! 694: self._o = None
! 695:
! 696: def __del__(self):
! 697: if self._o != None:
! 698: libxml2mod.xmlFreeTextReader(self._o)
! 699: self._o = None
! 700:
! 701: def SetErrorHandler(self,f,arg):
! 702: """Register an error handler that will be called back as
! 703: f(arg,msg,severity,locator)."""
! 704: if f is None:
! 705: libxml2mod.xmlTextReaderSetErrorHandler(\
! 706: self._o,None,None)
! 707: else:
! 708: libxml2mod.xmlTextReaderSetErrorHandler(\
! 709: self._o,_xmlTextReaderErrorFunc,(f,arg))
! 710:
! 711: def GetErrorHandler(self):
! 712: """Return (f,arg) as previously registered with setErrorHandler
! 713: or (None,None)."""
! 714: f,arg = libxml2mod.xmlTextReaderGetErrorHandler(self._o)
! 715: if f is None:
! 716: return None,None
! 717: else:
! 718: # assert f is _xmlTextReaderErrorFunc
! 719: return arg
! 720:
! 721: #
! 722: # The cleanup now goes though a wrappe in libxml.c
! 723: #
! 724: def cleanupParser():
! 725: libxml2mod.xmlPythonCleanupParser()
! 726:
! 727: # WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
! 728: #
! 729: # Everything before this line comes from libxml.py
! 730: # Everything after this line is automatically generated
! 731: #
! 732: # WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
! 733:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>