diff options
Diffstat (limited to 'Lib/xml/sax/saxutils.py')
| -rw-r--r-- | Lib/xml/sax/saxutils.py | 61 |
1 files changed, 42 insertions, 19 deletions
diff --git a/Lib/xml/sax/saxutils.py b/Lib/xml/sax/saxutils.py index 97d65d8..625bc12 100644 --- a/Lib/xml/sax/saxutils.py +++ b/Lib/xml/sax/saxutils.py @@ -3,14 +3,9 @@ A library of useful helper classes to the SAX classes, for the convenience of application and driver writers. """ -import os, urlparse, urllib, types -import handler -import xmlreader - -try: - _StringTypes = [types.StringType, types.UnicodeType] -except AttributeError: - _StringTypes = [types.StringType] +import os, urllib.parse, urllib.request +from . import handler +from . import xmlreader # See whether the xmlcharrefreplace error handler is # supported @@ -83,7 +78,7 @@ def quoteattr(data, entities={}): class XMLGenerator(handler.ContentHandler): - def __init__(self, out=None, encoding="iso-8859-1"): + def __init__(self, out=None, encoding="iso-8859-1", short_empty_elements=False): if out is None: import sys out = sys.stdout @@ -93,6 +88,8 @@ class XMLGenerator(handler.ContentHandler): self._current_context = self._ns_contexts[-1] self._undeclared_ns_maps = [] self._encoding = encoding + self._short_empty_elements = short_empty_elements + self._pending_start_element = False def _write(self, text): if isinstance(text, str): @@ -117,6 +114,11 @@ class XMLGenerator(handler.ContentHandler): # Return the unqualified name return name[1] + def _finish_pending_start_element(self,endElement=False): + if self._pending_start_element: + self._write('>') + self._pending_start_element = False + # ContentHandler methods def startDocument(self): @@ -133,15 +135,24 @@ class XMLGenerator(handler.ContentHandler): del self._ns_contexts[-1] def startElement(self, name, attrs): + self._finish_pending_start_element() self._write('<' + name) for (name, value) in attrs.items(): self._write(' %s=%s' % (name, quoteattr(value))) - self._write('>') + if self._short_empty_elements: + self._pending_start_element = True + else: + self._write(">") def endElement(self, name): - self._write('</%s>' % name) + if self._pending_start_element: + self._write('/>') + self._pending_start_element = False + else: + self._write('</%s>' % name) def startElementNS(self, name, qname, attrs): + self._finish_pending_start_element() self._write('<' + self._qname(name)) for prefix, uri in self._undeclared_ns_maps: @@ -153,18 +164,30 @@ class XMLGenerator(handler.ContentHandler): for (name, value) in attrs.items(): self._write(' %s=%s' % (self._qname(name), quoteattr(value))) - self._write('>') + if self._short_empty_elements: + self._pending_start_element = True + else: + self._write(">") def endElementNS(self, name, qname): - self._write('</%s>' % self._qname(name)) + if self._pending_start_element: + self._write('/>') + self._pending_start_element = False + else: + self._write('</%s>' % self._qname(name)) def characters(self, content): - self._write(escape(content)) + if content: + self._finish_pending_start_element() + self._write(escape(content)) def ignorableWhitespace(self, content): - self._write(content) + if content: + self._finish_pending_start_element() + self._write(content) def processingInstruction(self, target, data): + self._finish_pending_start_element() self._write('<?%s %s?>' % (target, data)) @@ -279,11 +302,11 @@ class XMLFilterBase(xmlreader.XMLReader): # --- Utility functions -def prepare_input_source(source, base = ""): +def prepare_input_source(source, base=""): """This function takes an InputSource and an optional base URL and returns a fully resolved InputSource object ready for reading.""" - if type(source) in _StringTypes: + if isinstance(source, str): source = xmlreader.InputSource(source) elif hasattr(source, "read"): f = source @@ -300,8 +323,8 @@ def prepare_input_source(source, base = ""): source.setSystemId(sysidfilename) f = open(sysidfilename, "rb") else: - source.setSystemId(urlparse.urljoin(base, sysid)) - f = urllib.urlopen(source.getSystemId()) + source.setSystemId(urllib.parse.urljoin(base, sysid)) + f = urllib.request.urlopen(source.getSystemId()) source.setByteStream(f) |
