Changeset 2133 for TI02-CSML/trunk/csml


Ignore:
Timestamp:
09/02/07 14:41:37 (13 years ago)
Author:
domlowe
Message:

Added new XML schema handling class to MOLES parser. The old class is still there but has been renamed OLDxmlschema. This can be removed entirely when happy that the new class is an improvement

File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI02-CSML/trunk/csml/csml2Moles/molesReadWrite.py

    r2129 r2133  
    55import sys 
    66 
     7 
     8#this is the NEW xml schema class 
    79class xmlSchema(object): 
     10    ''' this class creates a mapping of the xml schema sequences so that it can be referred to when  
     11    writing out a new moles document - this enables elements to be written in the order specified by the schema 
     12    If a particular sequence mapping can't be found then the elements will be written in whichever order python sees fit. 
     13    It tries various searches of the schema to pick out the sequences (which can be nested) 
     14    ''' 
     15    def __init__(self, schema): 
     16        self.schema=schema 
     17        self.types={} 
     18        self.sequences={} 
     19        self.names=[] 
     20        self.setup() 
     21         
     22         
     23    def __isParent(self,elem): 
     24        #if this element is a parent of other elements (excluding annotation and documentation) 
     25        #then return True else return false 
     26        if elem[:]==[]: 
     27            return False 
     28        for child in elem[:]: 
     29            if child.tag == '{http://www.w3.org/2001/XMLSchema}element': 
     30                return True 
     31            elif child.tag == '{http://www.w3.org/2001/XMLSchema}complexType': 
     32                return True 
     33            elif child.tag == '{http://www.w3.org/2001/XMLSchema}simpleType': 
     34                return True 
     35            elif child.tag == '{http://www.w3.org/2001/XMLSchema}annotation': 
     36                pass 
     37            elif child.tag == '{http://www.w3.org/2001/XMLSchema}sequence': 
     38                return True 
     39            elif child.tag == '{http://www.w3.org/2001/XMLSchema}choice': 
     40                return True 
     41            elif child.tag == '{http://www.w3.org/2001/XMLSchema}complexContent': 
     42                return True 
     43            elif child.tag == '{http://www.w3.org/2001/XMLSchema}documentation': 
     44                pass 
     45            elif child.tag == '{http://www.w3.org/2001/XMLSchema}restriction': 
     46                return True 
     47            elif child.tag == '{http://www.w3.org/2001/XMLSchema}extension': 
     48                pass 
     49            elif child.tag == '{http://www.w3.org/2001/XMLSchema}attribute': 
     50                pass #? 
     51            elif child.tag == '{http://www.w3.org/2001/XMLSchema}enumeration': 
     52                pass #? 
     53         
     54             #pattern 
     55             #attributeGroup 
     56             #minLength 
     57             #minInclusive 
     58             #maxInclusive 
     59 
     60        return False 
     61         
     62         
     63         
     64         
     65    def __checkChildren(self, parentclassname, elem): 
     66        childname = None 
     67        for child in elem[:]:                     
     68            if child.attrib.has_key('name'):         
     69                if child.attrib['name'][-4:]=='Type': 
     70                    childname=child.attrib['name'][:-4] 
     71                else: 
     72                    childname=child.attrib['name']         
     73                if child.attrib.has_key('type'): 
     74                    if child.attrib['type'][:6]=='moles:': 
     75                        typename=child.attrib['type'][6:-4] 
     76                        self.types[childname]=typename              
     77            elif child.attrib.has_key('ref'): 
     78                if child.attrib['ref'][:6]=='moles:': 
     79                    childname=child.attrib['ref'][6:] 
     80            if childname is not None: 
     81                if self.sequences[parentclassname] is None: 
     82                    self.sequences[parentclassname]=[childname] 
     83                else: 
     84                    tmp= self.sequences[parentclassname]                     
     85                    tmp.append(childname) 
     86                    self.sequences[parentclassname]=tmp              
     87                if self.__isParent(child): 
     88                    self.sequences[childname]=[] 
     89                    self. __checkChildren(childname,child)     
     90            else: 
     91                if self.__isParent(child): 
     92                    self. __checkChildren(parentclassname,child)     
     93 
     94    def __resolveTypes(self): 
     95        print self.types 
     96        for ty in self.types: 
     97            try: 
     98                self.sequences[ty]=self.sequences[self.types[ty]] 
     99            except: 
     100                pass 
     101             
     102    def setup(self):     
     103        tree = ET.parse(self.schema) 
     104        root = tree.getroot() 
     105        self.sequences['dummy']=[] 
     106        self.__checkChildren('dummy',root) 
     107        self.__resolveTypes() 
     108        self.sequences['dummy']=None 
     109     
     110    def lookupOrder(self, dict,classname): 
     111        '''takes the attributes in a dictionary and orders them according to the schema sequence''' 
     112        try:         
     113            order=self.sequences[classname] 
     114        except KeyError: 
     115            order = [] 
     116            for key in dict: 
     117                #print key error 
     118                print 'KEY ERROR %s'%classname 
     119                if key is not 'schema': 
     120                    if key is not 'ns': 
     121                         order.append(key) # if it can't be found an unordered list is returned from the original dictionary items 
     122            #print 'returning %s'%order 
     123        return order 
     124 
     125 
     126 
     127 
     128 
     129 
     130 
     131 
     132 
     133#this is the old XML schema class. hopefully we can throw this away if the other one works better 
     134class OLDxmlSchema(object): 
    8135    ''' this class creates a mapping of the xml schema sequences so that it can be referred to when  
    9136    writing out a new moles document - this enables elements to be written in the order specified by the schema 
Note: See TracChangeset for help on using the changeset viewer.