-
Notifications
You must be signed in to change notification settings - Fork 35
Expand file tree
/
Copy pathstdlib_xml_etree.py
More file actions
83 lines (77 loc) · 2.28 KB
/
stdlib_xml_etree.py
File metadata and controls
83 lines (77 loc) · 2.28 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
##
# types.io.stdlib_xml_etree
##
try:
import xml.etree.cElementTree as etree
except ImportError:
import xml.etree.ElementTree as etree
from .. import XMLOID
from ...python.functools import Composition as compose
oid_to_type = {
XMLOID: etree.ElementTree,
}
def xml_unpack(xmldata, XML = etree.XML):
try:
return XML(xmldata)
except Exception:
# try it again, but return the sequence of children.
return tuple(XML('<x>' + xmldata + '</x>'))
if not hasattr(etree, 'tostringlist'):
# Python 3.1 support.
def xml_pack(xml, tostr = etree.tostring, et = etree.ElementTree,
str = str, isinstance = isinstance, tuple = tuple
):
if isinstance(xml, str):
# If it's a string, encode and return.
return xml
elif isinstance(xml, tuple):
# If it's a tuple, encode and return the joined items.
# We do not accept lists here--emphasizing lists being used for ARRAY
# bounds.
return ''.join((x if isinstance(x, str) else tostr(x) for x in xml))
return tostr(xml)
def xml_io_factory(typoid, typio, c = compose):
return (
c((xml_pack, typio.encode)),
c((typio.decode, xml_unpack)),
etree.ElementTree,
)
else:
# New etree tostring API.
def xml_pack(xml, encoding, encoder,
tostr = etree.tostring, et = etree.ElementTree,
str = str, isinstance = isinstance, tuple = tuple,
):
if isinstance(xml, bytes):
return xml
if isinstance(xml, str):
# If it's a string, encode and return.
return encoder(xml)
elif isinstance(xml, tuple):
# If it's a tuple, encode and return the joined items.
# We do not accept lists here--emphasizing lists being used for ARRAY
# bounds.
##
# 3.2
# XXX: tostring doesn't include declaration with utf-8?
x = b''.join(
x.encode('utf-8') if isinstance(x, str) else
tostr(x, encoding = "utf-8")
for x in xml
)
else:
##
# 3.2
# XXX: tostring doesn't include declaration with utf-8?
x = tostr(xml, encoding = "utf-8")
if encoding in ('utf8','utf-8'):
return x
else:
return encoder(x.decode('utf-8'))
def xml_io_factory(typoid, typio, c = compose):
def local_xml_pack(x, encoder = typio.encode, typio = typio, xml_pack = xml_pack):
return xml_pack(x, typio.encoding, encoder)
return (local_xml_pack, c((typio.decode, xml_unpack)), etree.ElementTree,)
oid_to_io = {
XMLOID : xml_io_factory
}