--- a/buildframework/helium/sf/python/pythoncore/lib/amara.py Wed Jun 16 16:51:40 2010 +0300
+++ b/buildframework/helium/sf/python/pythoncore/lib/amara.py Fri Aug 13 14:59:05 2010 +0300
@@ -18,11 +18,50 @@
#===============================================================================
"""amara"""
-# pylint: disable-msg=E1103
-import sys
-if 'java' in sys.platform:
+# pylint: disable=E1103
+#import sys
+#if 'java' in sys.platform:
+# pass
+if True:
+ import os
import xml.dom.minidom
import urllib
+ import xpath
+ import xml.etree.ElementTree
+ import xml.etree.ElementInclude
+
+ # pylint: disable=W0212
+ def fixed_writexml(self, writer, indent="", addindent="", newl=""):
+ # indent = current indentation
+ # addindent = indentation to add to higher levels
+ # newl = newline string
+ writer.write(indent + "<" + self.tagName)
+
+ attrs = self._get_attributes()
+ a_names = attrs.keys()
+ a_names.sort()
+
+ for a_name in a_names:
+ writer.write(" %s=\"" % a_name)
+ xml.dom.minidom._write_data(writer, attrs[a_name].value)
+ writer.write("\"")
+ if self.childNodes:
+ if len(self.childNodes) == 1 \
+ and self.childNodes[0].nodeType == xml.dom.minidom.Node.TEXT_NODE:
+ writer.write(">")
+ self.childNodes[0].writexml(writer, "", "", "")
+ writer.write("</%s>%s" % (self.tagName, newl))
+ return
+ writer.write(">%s" % (newl))
+ for node in self.childNodes:
+ if node.__class__ == xml.dom.minidom.Text and node.data.strip() == '':
+ continue
+ node.writexml(writer, indent + addindent, addindent, newl)
+ writer.write("%s</%s>%s" % (indent, self.tagName, newl))
+ else:
+ writer.write("/>%s" % (newl))
+ # replace minidom's function with ours
+ xml.dom.minidom.Element.writexml = fixed_writexml
def parse(param):
"""parse"""
@@ -42,29 +81,55 @@
if isinstance(dom, file):
self.dom = xml.dom.minidom.parse(dom)
elif isinstance(dom, basestring):
- if dom.startswith('file:///'):
+ cwd_backup = os.getcwd()
+ if dom.startswith('file:///') or dom.startswith('///') or os.path.exists(dom):
+ try:
+ path = urllib.url2pathname(dom)
+ path = path.replace('file:///', '')
+ os.chdir(os.path.dirname(path))
+ except IOError:
+ pass
dom = urllib.urlopen(dom).read()
+
+ ettree = xml.etree.ElementTree.fromstring(dom)
+ xml.etree.ElementInclude.include(ettree)
+ dom = xml.etree.ElementTree.tostring(ettree)
+ os.chdir(cwd_backup)
self.dom = xml.dom.minidom.parseString(dom)
else:
self.dom = dom
def __getitem__(self, name):
return self.__getattr__(name)
-
+
+ def __setitem__(self, key, value):
+ self.xml_set_attribute(key, value)
+
def __getattr__(self, attr):
if isinstance(attr, basestring):
res = self.dom.getElementsByTagName(attr)
if len(res) == 0:
if hasattr(self.dom, 'documentElement'):
val = self.dom.documentElement.getAttribute(attr)
+ if not self.dom.documentElement.hasAttribute(attr):
+ raise Exception(attr + ' not found')
else:
val = self.dom.getAttribute(attr)
- if val == '':
- raise Exception(attr + ' not found')
+ if not self.dom.hasAttribute(attr):
+ raise Exception(attr + ' not found')
return val
return MinidomAmara(res[0], self.dom)
- return MinidomAmara(self.parent.getElementsByTagName(self.dom.tagName)[attr])
+ if self.parent:
+ return MinidomAmara(self.parent.getElementsByTagName(self.dom.tagName)[attr])
+ else:
+ raise Exception(str(attr) + ' not found')
+ def __setattr__(self, name, value):
+ if isinstance(value, basestring):
+ self.xml_set_attribute(name, value)
+ else:
+ object.__setattr__(self, name, value)
+
def __iter__(self):
for entry in self.parent.getElementsByTagName(self.dom.tagName):
yield MinidomAmara(entry)
@@ -76,13 +141,15 @@
text = text + t_text.data
return text
- def xml(self, out=None, indent=True, omitXmlDeclaration=False, encoding=''):
+ def xml(self, out=None, indent=False, omitXmlDeclaration=False, encoding='utf-8'):
"""xml"""
+ if omitXmlDeclaration:
+ pass
if out:
- out.write(self.dom.toprettyxml())
+ out.write(self.dom.toprettyxml(encoding=encoding))
if indent:
- return self.dom.toprettyxml()
- return self.dom.toxml()
+ return self.dom.toprettyxml(encoding=encoding)
+ return self.dom.toxml(encoding=encoding)
def xml_append_fragment(self, text):
"""xml append fragment"""
@@ -92,6 +159,9 @@
"""set XML attribute"""
self.dom.setAttribute(name, value)
+ def xml_remove_child(self, value):
+ self.dom.removeChild(value.dom)
+
def _getxml_children(self):
"""get xml children"""
l_attrib = []
@@ -142,24 +212,32 @@
def __eq__(self, obj):
return str(self) == obj
+ def __ne__(self, obj):
+ return str(self) != obj
def __len__(self):
- return len(self.parent.getElementsByTagName(self.dom.tagName))
+ if self.parent:
+ return len(self.parent.getElementsByTagName(self.dom.tagName))
+ return 1
- def xml_xpath(self, xpath):
+ def xml_xpath(self, axpath):
"""append to the XML path"""
- import java.io.ByteArrayInputStream
- import org.dom4j.io.SAXReader
- import org.dom4j.DocumentHelper
-
- stream = java.io.ByteArrayInputStream(java.lang.String(self.dom.toxml()).getBytes("UTF-8"))
- xmlReader = org.dom4j.io.SAXReader()
- doc = xmlReader.read(stream)
- xpath = org.dom4j.DocumentHelper.createXPath(xpath)
- signalNodes = xpath.selectNodes(doc)
- iterator = signalNodes.iterator()
- out = []
- while iterator.hasNext():
- p_iterator = iterator.next()
- out.append(MinidomAmara(p_iterator.asXML()))
- return out
+ results = []
+ for result in xpath.find(axpath, self.dom):
+ results.append(MinidomAmara(result))
+ return results
+# import java.io.ByteArrayInputStream
+# import org.dom4j.io.SAXReader
+# import org.dom4j.DocumentHelper
+#
+# stream = java.io.ByteArrayInputStream(java.lang.String(self.dom.toxml()).getBytes("UTF-8"))
+# xmlReader = org.dom4j.io.SAXReader()
+# doc = xmlReader.read(stream)
+# xpath = org.dom4j.DocumentHelper.createXPath(xpath)
+# signalNodes = xpath.selectNodes(doc)
+# iterator = signalNodes.iterator()
+# out = []
+# while iterator.hasNext():
+# p_iterator = iterator.next()
+# out.append(MinidomAmara(p_iterator.asXML()))
+# return out