mirror of
https://gitlab.gnome.org/GNOME/libxml2.git
synced 2025-07-29 11:41:22 +03:00
Fix python generator to not use deprecated xmllib
* python/generator.py: use xml.sax instead, patch based on similar fir for libvirt by Cole Robinson <crobinso@redhat.com>
This commit is contained in:
@ -24,77 +24,27 @@ else:
|
|||||||
#
|
#
|
||||||
#######################################################################
|
#######################################################################
|
||||||
import os
|
import os
|
||||||
import xmllib
|
import xml.sax
|
||||||
try:
|
|
||||||
import sgmlop
|
|
||||||
except ImportError:
|
|
||||||
sgmlop = None # accelerator not available
|
|
||||||
|
|
||||||
debug = 0
|
debug = 0
|
||||||
|
|
||||||
if sgmlop:
|
def getparser():
|
||||||
class FastParser:
|
# Attach parser to an unmarshalling object. return both objects.
|
||||||
"""sgmlop based XML parser. this is typically 15x faster
|
target = docParser()
|
||||||
than SlowParser..."""
|
parser = xml.sax.make_parser()
|
||||||
|
parser.setContentHandler(target)
|
||||||
|
return parser, target
|
||||||
|
|
||||||
def __init__(self, target):
|
class docParser(xml.sax.handler.ContentHandler):
|
||||||
|
|
||||||
# setup callbacks
|
|
||||||
self.finish_starttag = target.start
|
|
||||||
self.finish_endtag = target.end
|
|
||||||
self.handle_data = target.data
|
|
||||||
|
|
||||||
# activate parser
|
|
||||||
self.parser = sgmlop.XMLParser()
|
|
||||||
self.parser.register(self)
|
|
||||||
self.feed = self.parser.feed
|
|
||||||
self.entity = {
|
|
||||||
"amp": "&", "gt": ">", "lt": "<",
|
|
||||||
"apos": "'", "quot": '"'
|
|
||||||
}
|
|
||||||
|
|
||||||
def close(self):
|
|
||||||
try:
|
|
||||||
self.parser.close()
|
|
||||||
finally:
|
|
||||||
self.parser = self.feed = None # nuke circular reference
|
|
||||||
|
|
||||||
def handle_entityref(self, entity):
|
|
||||||
# <string> entity
|
|
||||||
try:
|
|
||||||
self.handle_data(self.entity[entity])
|
|
||||||
except KeyError:
|
|
||||||
self.handle_data("&%s;" % entity)
|
|
||||||
|
|
||||||
else:
|
|
||||||
FastParser = None
|
|
||||||
|
|
||||||
|
|
||||||
class SlowParser(xmllib.XMLParser):
|
|
||||||
"""slow but safe standard parser, based on the XML parser in
|
|
||||||
Python's standard library."""
|
|
||||||
|
|
||||||
def __init__(self, target):
|
|
||||||
self.unknown_starttag = target.start
|
|
||||||
self.handle_data = target.data
|
|
||||||
self.unknown_endtag = target.end
|
|
||||||
xmllib.XMLParser.__init__(self)
|
|
||||||
|
|
||||||
def getparser(target = None):
|
|
||||||
# get the fastest available parser, and attach it to an
|
|
||||||
# unmarshalling object. return both objects.
|
|
||||||
if target is None:
|
|
||||||
target = docParser()
|
|
||||||
if FastParser:
|
|
||||||
return FastParser(target), target
|
|
||||||
return SlowParser(target), target
|
|
||||||
|
|
||||||
class docParser:
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._methodname = None
|
self._methodname = None
|
||||||
self._data = []
|
self._data = []
|
||||||
self.in_function = 0
|
self.in_function = 0
|
||||||
|
|
||||||
|
self.startElement = self.start
|
||||||
|
self.endElement = self.end
|
||||||
|
self.characters = self.data
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
if debug:
|
if debug:
|
||||||
print "close"
|
print "close"
|
||||||
|
Reference in New Issue
Block a user