1
2
3
4
5
6
7
8
9
10 import re
11
12 try:
13 import cElementTree as ET
14 import elementtree
15
16 except ImportError:
17 try:
18 from elementtree import ElementTree as ET
19 import elementtree
20
21 except ImportError:
22 """ this seems to be necessary with the python2.5 on the Maemo platform """
23 try:
24 from xml.etree import cElementTree as ET
25 from xml import etree as elementtree
26 except ImportError:
27 try:
28 from xml.etree import ElementTree as ET
29 from xml import etree as elementtree
30 except ImportError:
31
32 raise ImportError, "no ElementTree module found, critical error"
33
34 utf8_escape = re.compile(eval(r'u"[&<>\"]+"'))
35 escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"'))
36
38
39 def escape_entities(m, map=elementtree.ElementTree._escape_map):
40 out = []
41 append = out.append
42 for char in m.group():
43 t = map.get(char)
44 if t is None:
45 t = "&#%d;" % ord(char)
46 append(t)
47 return ''.join(out)
48 try:
49 return elementtree.ElementTree._encode(pattern.sub(escape_entities, text), 'ascii')
50 except TypeError:
51 elementtree.ElementTree._raise_serialization_error(text)
52
54
55 def escape_entities(m, map=elementtree.ElementTree._escape_map):
56 out = []
57 append = out.append
58 for char in m.group():
59 t = map.get(char)
60 if t is None:
61 t = "&#%d;" % ord(char)
62 append(t)
63 if type(text) == unicode:
64 return ''.join(out)
65 else:
66 return u''.encode('utf-8').join(out)
67 try:
68 if type(text) == unicode:
69 return elementtree.ElementTree._encode(escape.sub(escape_entities, text), 'ascii')
70 else:
71 return elementtree.ElementTree._encode(utf8_escape.sub(escape_entities, text.decode('utf-8')), 'utf-8')
72 except TypeError:
73
74 elementtree.ElementTree._raise_serialization_error(text)
75
76 elementtree.ElementTree._encode_entity = new_encode_entity
77
78
79
80
81
82
83
84 if not hasattr(ET, 'XMLParser'):
86 return ET.XMLTreeBuilder()
87
88 ET.XMLParser = XMLParser
89
91
92
93
94
95
96 elementtree.ElementTree._namespace_map.update(namespaces)
97
100
102 """ generate pretty looking XML, based upon:
103 http://effbot.org/zone/element-lib.htm#prettyprint
104 """
105 i = "\n" + level*" "
106 if len(elem):
107 if not elem.text or not elem.text.strip():
108 elem.text = i + " "
109 for elem in elem:
110 indent(elem, level+1)
111 if not elem.tail or not elem.tail.strip():
112 elem.tail = i
113 if not elem.tail or not elem.tail.strip():
114 elem.tail = i
115 else:
116 if level and (not elem.tail or not elem.tail.strip()):
117 elem.tail = i
118
120 p = ET.XMLParser(encoding=encoding)
121
122
123
124 if isinstance(data, (list, tuple)):
125 data, _ = data
126
127 try:
128 data = data.encode(encoding)
129 except UnicodeDecodeError:
130 pass
131 except Exception, error:
132 print "parse_xml encode Exception", error
133 import traceback
134 traceback.print_exc()
135
136
137 data = data.replace('\x00','')
138 try:
139 p.feed(data)
140 except Exception, error:
141 print "parse_xml feed Exception", error
142 print error, repr(data)
143 return None
144 else:
145 return ET.ElementTree(p.close())
146