#
# Validate RSPEC hiearchy, values, types, and names using supplied xsd.
+# Class to translate xml to dict
#
# Faiyaz Ahmed <faiyaza at cs dot princeton dot edu>
#
logging.basicConfig(level=logging.DEBUG)
-class Schema():
- '''Manipulates Rspec xsd into python dict'''
- def __init__(self):
- self.NSURL = "www.planet-lab.org"
- self.xsd = "planetlab.xsd"
- self.schemaDom = None # parsed schema file's DOM
- self.schemaDict = self.nodeDict()
-
- def _getSchema(self):
- '''If the schema doesn't exist at the NameSpace's URL, then use the
- local file.'''
- conn = httplib.HTTPConnection(self.NSURL)
- conn.request("GET", "/" + self.xsd)
- r1 = conn.getresponse()
- if r1.status != 200:
- logging.debug("http://%s/%s: file not found" %(self.NSURL,self.xsd))
- if os.path.exists(self.xsd):
- logging.debug("using local copy.")
- self.schemaDom = minidom.parse(self.xsd)
+class Xmlxlate(file):
+ '''Manipulates xml into python dict'''
+ def __init__(self, file):
+ filedom = minidom.parse(file)
+ if filedom.nodeName == "#document":
+ self.xmlDom = filedom.childNodes[0]
else:
- self.schemaDom = minidom.parseString(r1.read())
- # XML begings with a '#document'. Just check to be safe.
- if self.schemaDom.nodeName == "#document":
- self.schemaDom = self.schemaDom.childNodes[0]
+ self.xmlDom = filedom
+ self.xmlDict = self.nodeDict()
+
+
+ #def _getSchema(self):
+ # '''If the schema doesn't exist at the NameSpace's URL, then use the
+ # local file.'''
+ # conn = httplib.HTTPConnection(self.NSURL)
+ # conn.request("GET", "/" + self.xsd)
+ # r1 = conn.getresponse()
+ # if r1.status != 200:
+ # logging.debug("http://%s/%s: file not found" %(self.NSURL,self.xsd))
+ # if os.path.exists(self.xsd):
+ # logging.debug("using local copy.")
+ # self.schemaDom = minidom.parse(self.xsd)
+ # else:
+ # self.schemaDom = minidom.parseString(r1.read())
+ # # XML begings with a '#document'. Just check to be safe.
+ # if self.schemaDom.nodeName == "#document":
+ # self.schemaDom = self.schemaDom.childNodes[0]
def _getText(self, nodelist):
rc = rc + node.data
return rc
- # The rspec is comprised of 2 parts, and 1 reference:
- # attributes/elements describe individual resources
- # complexTypes are used to describe a set of attributes/elements
- # complexTypes can include a reference to other complexTypes.
-
-
def _getName(self, node):
'''Gets name of node. If tag has no name, then return tag's localName'''
if not node.nodeName.startswith("#"):
{name : [{attributename : {name: value,}, sequence]}'''
children = [] # array of dicts. 1 for each element/attribute.
node = {}
- if not nodeDom:
- self._getSchema()
- nodeDom = self.schemaDom
+ # if a dom isn't passed in the arguments, use the one defined in the class.
+ if not nodeDom: nodeDom = self.xmlDom
if nodeDom.nodeName and not nodeDom.nodeName.startswith("#"):
# attributes have tags and values. get {tag: value}, else {type: value}
children.append(self._attributeDict(nodeDom))
def main(fname):
pp = pprint.PrettyPrinter(indent=4)
- dom = minidom.parse(fname)
- s = Schema()
- print "Testing Complex Type:"
- pp.pprint(s.nodeDict(dom.childNodes[0].childNodes[21]))
+ s = Xmlxlate(fname)
print "Testing Whole Doc:"
- pp.pprint(s.nodeDict(dom.childNodes[0]))
+ pp.pprint(s.xmlDict)
+
+ print "Testing Complex Type:"
+ pp.pprint(s.nodeDict(s.xmlDom.childNodes[21]))
- print "Testing URL ofWhole doc:"
- pp.pprint(s.schemaDict)
+ print "Testing rspec parsing:"
+ rspec = Xmlxlate("sample_rspec.xml")
+ pp.pprint(rspec.xmlDict)
if __name__ == '__main__':
main(fname="planetlab.xsd")