16 # |
16 # |
17 #Description: |
17 #Description: |
18 #=============================================================================== |
18 #=============================================================================== |
19 """amara""" |
19 """amara""" |
20 |
20 |
21 # pylint: disable-msg=E1103 |
21 # pylint: disable=E1103 |
22 import sys |
22 #import sys |
23 if 'java' in sys.platform: |
23 #if 'java' in sys.platform: |
|
24 # pass |
|
25 if True: |
|
26 import os |
24 import xml.dom.minidom |
27 import xml.dom.minidom |
25 import urllib |
28 import urllib |
|
29 import xpath |
|
30 import xml.etree.ElementTree |
|
31 import xml.etree.ElementInclude |
|
32 |
|
33 # pylint: disable=W0212 |
|
34 def fixed_writexml(self, writer, indent="", addindent="", newl=""): |
|
35 # indent = current indentation |
|
36 # addindent = indentation to add to higher levels |
|
37 # newl = newline string |
|
38 writer.write(indent + "<" + self.tagName) |
|
39 |
|
40 attrs = self._get_attributes() |
|
41 a_names = attrs.keys() |
|
42 a_names.sort() |
|
43 |
|
44 for a_name in a_names: |
|
45 writer.write(" %s=\"" % a_name) |
|
46 xml.dom.minidom._write_data(writer, attrs[a_name].value) |
|
47 writer.write("\"") |
|
48 if self.childNodes: |
|
49 if len(self.childNodes) == 1 \ |
|
50 and self.childNodes[0].nodeType == xml.dom.minidom.Node.TEXT_NODE: |
|
51 writer.write(">") |
|
52 self.childNodes[0].writexml(writer, "", "", "") |
|
53 writer.write("</%s>%s" % (self.tagName, newl)) |
|
54 return |
|
55 writer.write(">%s" % (newl)) |
|
56 for node in self.childNodes: |
|
57 if node.__class__ == xml.dom.minidom.Text and node.data.strip() == '': |
|
58 continue |
|
59 node.writexml(writer, indent + addindent, addindent, newl) |
|
60 writer.write("%s</%s>%s" % (indent, self.tagName, newl)) |
|
61 else: |
|
62 writer.write("/>%s" % (newl)) |
|
63 # replace minidom's function with ours |
|
64 xml.dom.minidom.Element.writexml = fixed_writexml |
26 |
65 |
27 def parse(param): |
66 def parse(param): |
28 """parse""" |
67 """parse""" |
29 return MinidomAmara(param) |
68 return MinidomAmara(param) |
30 |
69 |
40 def __init__(self, dom, parent=None): |
79 def __init__(self, dom, parent=None): |
41 self.parent = parent |
80 self.parent = parent |
42 if isinstance(dom, file): |
81 if isinstance(dom, file): |
43 self.dom = xml.dom.minidom.parse(dom) |
82 self.dom = xml.dom.minidom.parse(dom) |
44 elif isinstance(dom, basestring): |
83 elif isinstance(dom, basestring): |
45 if dom.startswith('file:///'): |
84 cwd_backup = os.getcwd() |
|
85 if dom.startswith('file:///') or dom.startswith('///') or os.path.exists(dom): |
|
86 try: |
|
87 path = urllib.url2pathname(dom) |
|
88 path = path.replace('file:///', '') |
|
89 os.chdir(os.path.dirname(path)) |
|
90 except IOError: |
|
91 pass |
46 dom = urllib.urlopen(dom).read() |
92 dom = urllib.urlopen(dom).read() |
|
93 |
|
94 ettree = xml.etree.ElementTree.fromstring(dom) |
|
95 xml.etree.ElementInclude.include(ettree) |
|
96 dom = xml.etree.ElementTree.tostring(ettree) |
|
97 os.chdir(cwd_backup) |
47 self.dom = xml.dom.minidom.parseString(dom) |
98 self.dom = xml.dom.minidom.parseString(dom) |
48 else: |
99 else: |
49 self.dom = dom |
100 self.dom = dom |
50 |
101 |
51 def __getitem__(self, name): |
102 def __getitem__(self, name): |
52 return self.__getattr__(name) |
103 return self.__getattr__(name) |
53 |
104 |
|
105 def __setitem__(self, key, value): |
|
106 self.xml_set_attribute(key, value) |
|
107 |
54 def __getattr__(self, attr): |
108 def __getattr__(self, attr): |
55 if isinstance(attr, basestring): |
109 if isinstance(attr, basestring): |
56 res = self.dom.getElementsByTagName(attr) |
110 res = self.dom.getElementsByTagName(attr) |
57 if len(res) == 0: |
111 if len(res) == 0: |
58 if hasattr(self.dom, 'documentElement'): |
112 if hasattr(self.dom, 'documentElement'): |
59 val = self.dom.documentElement.getAttribute(attr) |
113 val = self.dom.documentElement.getAttribute(attr) |
|
114 if not self.dom.documentElement.hasAttribute(attr): |
|
115 raise Exception(attr + ' not found') |
60 else: |
116 else: |
61 val = self.dom.getAttribute(attr) |
117 val = self.dom.getAttribute(attr) |
62 if val == '': |
118 if not self.dom.hasAttribute(attr): |
63 raise Exception(attr + ' not found') |
119 raise Exception(attr + ' not found') |
64 return val |
120 return val |
65 return MinidomAmara(res[0], self.dom) |
121 return MinidomAmara(res[0], self.dom) |
66 return MinidomAmara(self.parent.getElementsByTagName(self.dom.tagName)[attr]) |
122 if self.parent: |
67 |
123 return MinidomAmara(self.parent.getElementsByTagName(self.dom.tagName)[attr]) |
|
124 else: |
|
125 raise Exception(str(attr) + ' not found') |
|
126 |
|
127 def __setattr__(self, name, value): |
|
128 if isinstance(value, basestring): |
|
129 self.xml_set_attribute(name, value) |
|
130 else: |
|
131 object.__setattr__(self, name, value) |
|
132 |
68 def __iter__(self): |
133 def __iter__(self): |
69 for entry in self.parent.getElementsByTagName(self.dom.tagName): |
134 for entry in self.parent.getElementsByTagName(self.dom.tagName): |
70 yield MinidomAmara(entry) |
135 yield MinidomAmara(entry) |
71 |
136 |
72 def __str__(self): |
137 def __str__(self): |
74 for t_text in self.dom.childNodes: |
139 for t_text in self.dom.childNodes: |
75 if t_text.nodeType == t_text.TEXT_NODE and t_text.data != None: |
140 if t_text.nodeType == t_text.TEXT_NODE and t_text.data != None: |
76 text = text + t_text.data |
141 text = text + t_text.data |
77 return text |
142 return text |
78 |
143 |
79 def xml(self, out=None, indent=True, omitXmlDeclaration=False, encoding=''): |
144 def xml(self, out=None, indent=False, omitXmlDeclaration=False, encoding='utf-8'): |
80 """xml""" |
145 """xml""" |
|
146 if omitXmlDeclaration: |
|
147 pass |
81 if out: |
148 if out: |
82 out.write(self.dom.toprettyxml()) |
149 out.write(self.dom.toprettyxml(encoding=encoding)) |
83 if indent: |
150 if indent: |
84 return self.dom.toprettyxml() |
151 return self.dom.toprettyxml(encoding=encoding) |
85 return self.dom.toxml() |
152 return self.dom.toxml(encoding=encoding) |
86 |
153 |
87 def xml_append_fragment(self, text): |
154 def xml_append_fragment(self, text): |
88 """xml append fragment""" |
155 """xml append fragment""" |
89 self.dom.appendChild(xml.dom.minidom.parseString(text).documentElement) |
156 self.dom.appendChild(xml.dom.minidom.parseString(text).documentElement) |
90 |
157 |
91 def xml_set_attribute(self, name, value): |
158 def xml_set_attribute(self, name, value): |
92 """set XML attribute""" |
159 """set XML attribute""" |
93 self.dom.setAttribute(name, value) |
160 self.dom.setAttribute(name, value) |
|
161 |
|
162 def xml_remove_child(self, value): |
|
163 self.dom.removeChild(value.dom) |
94 |
164 |
95 def _getxml_children(self): |
165 def _getxml_children(self): |
96 """get xml children""" |
166 """get xml children""" |
97 l_attrib = [] |
167 l_attrib = [] |
98 for elem in self.dom.childNodes: |
168 for elem in self.dom.childNodes: |
140 xml_children = property(_getxml_children) |
210 xml_children = property(_getxml_children) |
141 xml_attributes = property(_getxml_attributes) |
211 xml_attributes = property(_getxml_attributes) |
142 |
212 |
143 def __eq__(self, obj): |
213 def __eq__(self, obj): |
144 return str(self) == obj |
214 return str(self) == obj |
|
215 def __ne__(self, obj): |
|
216 return str(self) != obj |
145 |
217 |
146 def __len__(self): |
218 def __len__(self): |
147 return len(self.parent.getElementsByTagName(self.dom.tagName)) |
219 if self.parent: |
148 |
220 return len(self.parent.getElementsByTagName(self.dom.tagName)) |
149 def xml_xpath(self, xpath): |
221 return 1 |
|
222 |
|
223 def xml_xpath(self, axpath): |
150 """append to the XML path""" |
224 """append to the XML path""" |
151 import java.io.ByteArrayInputStream |
225 results = [] |
152 import org.dom4j.io.SAXReader |
226 for result in xpath.find(axpath, self.dom): |
153 import org.dom4j.DocumentHelper |
227 results.append(MinidomAmara(result)) |
154 |
228 return results |
155 stream = java.io.ByteArrayInputStream(java.lang.String(self.dom.toxml()).getBytes("UTF-8")) |
229 # import java.io.ByteArrayInputStream |
156 xmlReader = org.dom4j.io.SAXReader() |
230 # import org.dom4j.io.SAXReader |
157 doc = xmlReader.read(stream) |
231 # import org.dom4j.DocumentHelper |
158 xpath = org.dom4j.DocumentHelper.createXPath(xpath) |
232 # |
159 signalNodes = xpath.selectNodes(doc) |
233 # stream = java.io.ByteArrayInputStream(java.lang.String(self.dom.toxml()).getBytes("UTF-8")) |
160 iterator = signalNodes.iterator() |
234 # xmlReader = org.dom4j.io.SAXReader() |
161 out = [] |
235 # doc = xmlReader.read(stream) |
162 while iterator.hasNext(): |
236 # xpath = org.dom4j.DocumentHelper.createXPath(xpath) |
163 p_iterator = iterator.next() |
237 # signalNodes = xpath.selectNodes(doc) |
164 out.append(MinidomAmara(p_iterator.asXML())) |
238 # iterator = signalNodes.iterator() |
165 return out |
239 # out = [] |
|
240 # while iterator.hasNext(): |
|
241 # p_iterator = iterator.next() |
|
242 # out.append(MinidomAmara(p_iterator.asXML())) |
|
243 # return out |