tostring.escape : optimization

use of xml.etree.ElementTree._escape_attrib and xml.etree.ElementTree._escape_cdata
This commit is contained in:
Jean-Philippe Caruana 2013-07-30 18:51:23 +02:00
parent 88e64dbfae
commit c02adbb8e1
2 changed files with 22 additions and 30 deletions

View File

@ -140,33 +140,26 @@ def tostring(xml=None, xmlns='', stream=None, outbuffer='',
def escape(text, use_cdata=False): def escape(text, use_cdata=False):
"""Convert special characters in XML to escape sequences. encoding = 'utf-8'
from xml.etree.ElementTree import _escape_cdata, _raise_serialization_error
:param string text: The XML text to convert. if use_cdata:
:rtype: Unicode string return _escape_cdata(text, encoding)
"""
if sys.version_info < (3, 0):
if type(text) != types.UnicodeType:
text = unicode(text, 'utf-8', 'ignore')
escapes = {'&': '&amp;', # copied from xml.etree.ElementTree._escape_attrib with "&apos;" case
'<': '&lt;', try:
'>': '&gt;', if "&" in text:
"'": '&apos;', text = text.replace("&", "&amp;")
'"': '&quot;'} if "<" in text:
text = text.replace("<", "&lt;")
if not use_cdata: if ">" in text:
text = list(text) text = text.replace(">", "&gt;")
for i, c in enumerate(text): if "\"" in text:
text[i] = escapes.get(c, c) text = text.replace("\"", "&quot;")
return ''.join(text) if "'" in text:
else: text = text.replace("'", "&apos;")
escape_needed = False if "\n" in text:
for c in text: text = text.replace("\n", "&#10;")
if c in escapes: return text.encode(encoding, "xmlcharrefreplace")
escape_needed = True except (TypeError, AttributeError):
break _raise_serialization_error(text)
if escape_needed:
escaped = map(lambda x : "<![CDATA[%s]]>" % x, text.split("]]>"))
return "<![CDATA[]]]><![CDATA[]>]]>".join(escaped)
return text

View File

@ -34,8 +34,7 @@ class TestToString(SleekTest):
desired = """&lt;foo bar=&quot;baz&quot;&gt;&apos;Hi""" desired = """&lt;foo bar=&quot;baz&quot;&gt;&apos;Hi"""
desired += """ &amp; welcome!&apos;&lt;/foo&gt;""" desired += """ &amp; welcome!&apos;&lt;/foo&gt;"""
self.failUnless(escaped == desired, self.assertEqual(escaped, desired)
"XML escaping did not work: %s." % escaped)
def testEmptyElement(self): def testEmptyElement(self):
"""Test converting an empty element to a string.""" """Test converting an empty element to a string."""