cleaned up imports
[sfa.git] / sfa / util / rspec.py
index c030171..ffc816c 100644 (file)
@@ -1,12 +1,13 @@
-### $Id$
-### $URL$
-
 import sys
 import pprint
 import os
+from StringIO import StringIO
+from types import StringTypes, ListType
 import httplib
 from xml.dom import minidom
-from types import StringTypes, ListType
+from lxml import etree
+
+from sfa.util.sfalogging import sfa_logger
 
 class RSpec:
 
@@ -137,23 +138,25 @@ class RSpec:
             if nodeDom.hasChildNodes():
                 for child in nodeDom.childNodes:
                     childName = self._getName(child)
-                    # skip null children 
-                    if not childName:
-                        continue
-                    # initialize the possible array of children        
-                    if not node[elementName].has_key(childName):
-                        node[elementName][childName] = []
-                    # if child node has text child nodes
-                    # append the children to the array as strings
-                    if child.hasChildNodes() and isinstance(child.childNodes[0], minidom.Text):
-                        for nextchild in child.childNodes:
+                    
+                    # skip null children
+                    if not childName: continue
+
+                    # initialize the possible array of children
+                    if not node[elementName].has_key(childName): node[elementName][childName] = []
+
+                    if isinstance(child, minidom.Text):
+                        # add if data is not empty
+                        if child.data.strip():
                             node[elementName][childName].append(nextchild.data)
-                    # convert element child node to dict
-                    else:       
+                    elif child.hasChildNodes() and isinstance(child.childNodes[0], minidom.Text):
+                        for nextchild in child.childNodes:  
+                            node[elementName][childName].append(nextchild.data)
+                    else:
                         childdict = self.toDict(child)
                         for value in childdict.values():
                             node[elementName][childName].append(value)
-                    #node[childName].append(self.toDict(child))
+
         return node
 
   
@@ -171,11 +174,19 @@ class RSpec:
         return self.rootNode.toprettyxml()
 
   
+    def __removeWhitespaceNodes(self, parent):
+        for child in list(parent.childNodes):
+            if child.nodeType == minidom.Node.TEXT_NODE and child.data.strip() == '':
+                parent.removeChild(child)
+            else:
+                self.__removeWhitespaceNodes(child)
+
     def parseFile(self, filename):
         """
         read a local xml file and store it as a dom object.
         """
         dom = minidom.parse(filename)
+        self.__removeWhitespaceNodes(dom)
         self.rootNode = dom.childNodes[0]
 
 
@@ -183,8 +194,8 @@ class RSpec:
         """
         read an xml string and store it as a dom object.
         """
-        xml = xml.replace('\n', '').replace('\t', '').strip()
         dom = minidom.parseString(xml)
+        self.__removeWhitespaceNodes(dom)
         self.rootNode = dom.childNodes[0]
 
  
@@ -207,11 +218,13 @@ class RSpec:
 
     def _parseXSD(self, xsdURI):
         """
-        Download XSD from URL, or if file, read local xsd file and set schemaDict
+        Download XSD from URL, or if file, read local xsd file and set
+        schemaDict.
+        
+        Since the schema definiton is a global namespace shared by and
+        agreed upon by others, this should probably be a URL.  Check
+        for URL, download xsd, parse, or if local file, use that.
         """
-        # Since the schema definiton is a global namespace shared by and agreed upon by
-        # others, this should probably be a URL.  Check for URL, download xsd, parse, or 
-        # if local file, use local file.
         schemaDom = None
         if xsdURI.startswith("http"):
             try: 
@@ -219,15 +232,14 @@ class RSpec:
             except Exception, e:
                 # logging.debug("%s: web file not found" % xsdURI)
                 # logging.debug("Using local file %s" % self.xsd")
-                print e
-                print "Can't find %s on the web. Continuing." % xsdURI
+                sfa_logger().log_exc("rspec.parseXSD: can't find %s on the web. Continuing." % xsdURI)
         if not schemaDom:
             if os.path.exists(xsdURI):
                 # logging.debug("using local copy.")
-                print "Using local %s" % xsdURI
+                sfa_logger().debug("rspec.parseXSD: Using local %s" % xsdURI)
                 schemaDom = minidom.parse(xsdURI)
             else:
-                raise Exception("Can't find xsd locally")
+                raise Exception("rspec.parseXSD: can't find xsd locally")
         self.schemaDict = self.toDict(schemaDom.childNodes[0])