from xml.dom import minidom
from types import StringTypes, ListType
-class Rspec:
+class RSpec:
def __init__(self, xml = None, xsd = None, NSURL = None):
'''
dict[key]=[value]
return dict
- def toGenDict(self, nodeDom=None, parentdict={}, siblingdict={}, parent=None):
+ def toGenDict(self, nodeDom=None, parentdict=None, siblingdict={}, parent=None):
"""
convert an XML to a nested dict:
* Non-terminal nodes (elements with string children and attributes) are simple dictionaries
curNodeName = nodeDom.localName
- if (nodeDom.nodeValue):
- siblingdict = self.appendToDictOrCreate(siblingdict, parent, nodeDom.nodeValue)
- elif (nodeDom.hasChildNodes()):
- for child in nodeDom.childNodes:
- siblingdict = self.toGenDict(child, None, siblingdict,curNodeName)
-
+ if (nodeDom.hasChildNodes()):
+ childdict={}
for attribute in nodeDom.attributes.keys():
- siblingdict = self.appendToDictOrCreate(siblingdict, attribute, nodeDom.getAttribute(attribute))
+ childdict = self.appendToDictOrCreate(childdict, attribute, nodeDom.getAttribute(attribute))
+ for child in nodeDom.childNodes[:-1]:
+ if (child.nodeValue):
+ siblingdict = self.appendToDictOrCreate(siblingdict, curNodeName, child.nodeValue)
+ else:
+ childdict = self.toGenDict(child, None, childdict, curNodeName)
+
+ child = nodeDom.childNodes[-1]
+ if (child.nodeValue):
+ siblingdict = self.appendToDictOrCreate(siblingdict, curNodeName, child.nodeValue)
+ if (childdict):
+ siblingdict = self.appendToDictOrCreate(siblingdict, curNodeName, childdict)
+ else:
+ siblingdict = self.toGenDict(child, siblingdict, childdict, curNodeName)
+ else:
+ childdict={}
+ for attribute in nodeDom.attributes.keys():
+ childdict = self.appendToDictOrCreate(childdict, attribute, nodeDom.getAttribute(attribute))
+ self.appendToDictOrCreate(siblingdict, curNodeName, childdict)
+
if (parentdict is not None):
- parentdict = self.appendToDictOrCreate(parentdict, curNodeName, siblingdict)
+ parentdict = self.appendToDictOrCreate(parentdict, parent, siblingdict)
return parentdict
else:
return siblingdict
"""
Convert a dictionary into a dom object and store it.
"""
- self.rootNode = self.dict2dom(rdict, include_doc)
+ self.rootNode = self.dict2dom(rdict, include_doc).childNodes[0]
def getDictsByTagName(self, tagname, dom = None):
-class RecordSpec(Rspec):
+class RecordSpec(RSpec):
root_tag = 'record'
def parseDict(self, rdict, include_doc = False):
record_dict = rdict
if not len(rdict.keys()) == 1:
record_dict = {self.root_tag : rdict}
- return Rspec.dict2dom(self, record_dict, include_doc)
+ return RSpec.dict2dom(self, record_dict, include_doc)
# vim:ts=4:expandtab