from xml.dom import minidom
from types import StringTypes, ListType
-class Rspec:
+class RSpec:
def __init__(self, xml = None, xsd = None, NSURL = None):
'''
self.dict = {}
self.schemaDict = {}
self.NSURL = NSURL
- if xml:
+ if xml:
if type(xml) == file:
self.parseFile(xml)
- if type(xml) == str:
+ if type(xml) in StringTypes:
self.parseString(xml)
self.dict = self.toDict()
if xsd:
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)
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:
- siblingdict[curNodeName]=[]
+ 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, parent, 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):
self.filter(tagname, attribute, blacklist, whitelist, child)
+ def merge(self, rspecs, tagname, dom=None):
+ """
+ Merge this rspec with the requested rspec based on the specified
+ starting tag name. The start tag (and all of its children) will be merged
+ """
+ tempdict = {}
+ if not dom:
+ dom = self.rootNode
+
+ whitelist = []
+ blacklist = []
+
+ if dom.localName in [tagname] and dom.attributes.has_key(attribute):
+ if whitelist and dom.attributes.get(attribute).value not in whitelist:
+ dom.parentNode.removeChild(dom)
+ if blacklist and dom.attributes.get(attribute).value in blacklist:
+ dom.parentNode.removeChild(dom)
+
+ if dom.hasChildNodes():
+ for child in dom.childNodes:
+ self.filter(tagname, attribute, blacklist, whitelist, child)
+
def validateDicts(self):
types = {
'EInt' : int,
-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