[compat] compat_etree_fromstring: only decode bytes objects

This commit is contained in:
Jaime Marquínez Ferrándiz 2015-10-25 20:30:54 +01:00
parent 36e6f62cd0
commit 387db16a78
2 changed files with 5 additions and 4 deletions

View file

@ -74,9 +74,10 @@ def test_compat_shlex_split(self):
self.assertEqual(compat_shlex_split('-option "one two"'), ['-option', 'one two']) self.assertEqual(compat_shlex_split('-option "one two"'), ['-option', 'one two'])
def test_compat_etree_fromstring(self): def test_compat_etree_fromstring(self):
xml = '<el foo="bar"></el>' xml = '<el foo="bar" spam="中文"></el>'
doc = compat_etree_fromstring(xml.encode('utf-8')) doc = compat_etree_fromstring(xml.encode('utf-8'))
self.assertTrue(isinstance(doc.attrib['foo'], compat_str)) self.assertTrue(isinstance(doc.attrib['foo'], compat_str))
self.assertTrue(isinstance(doc.attrib['spam'], compat_str))
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()

View file

@ -216,8 +216,7 @@ def data_open(self, req):
if sys.version_info[0] >= 3: if sys.version_info[0] >= 3:
compat_etree_fromstring = xml.etree.ElementTree.fromstring compat_etree_fromstring = xml.etree.ElementTree.fromstring
else: else:
# on python 2.x the the attributes of a node are str objects instead of # on python 2.x the the attributes of a node aren't always unicode objects
# unicode
etree = xml.etree.ElementTree etree = xml.etree.ElementTree
# on 2.6 XML doesn't have a parser argument, function copied from CPython # on 2.6 XML doesn't have a parser argument, function copied from CPython
@ -231,7 +230,8 @@ def _XML(text, parser=None):
def _element_factory(*args, **kwargs): def _element_factory(*args, **kwargs):
el = etree.Element(*args, **kwargs) el = etree.Element(*args, **kwargs)
for k, v in el.items(): for k, v in el.items():
el.set(k, v.decode('utf-8')) if isinstance(v, bytes):
el.set(k, v.decode('utf-8'))
return el return el
def compat_etree_fromstring(text): def compat_etree_fromstring(text):