Changeset 1831


Ignore:
Timestamp:
07/12/06 15:12:53 (13 years ago)
Author:
domlowe
Message:

rewrite of from and to xml methods in csElement class to make them more robust

Location:
TI02-CSML/branches/CSML2
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TI02-CSML/branches/CSML2/csParser.py

    r1823 r1831  
    8888                if item in self.ATTRIBUTES: 
    8989                    csmlfrag.set(item, self.__dict__[item]) 
    90          #but probably need to handle the case where GML attributes are set without namespace 
    91          #to allow for  use of classname(id = 'blah')  
    9290            for item in self.__dict__: 
    9391                if GML(item) in self.ATTRIBUTES: 
    9492                    csmlfrag.set(GML(item), self.__dict__[item])        
    9593    # self.CHILDREN (recursive - calls the toXML method of children 
    96         for att in self.__dict__:              
     94        for att in self.__dict__: 
    9795            if att not in ['ATTRIBUTES', 'CHILDREN', 'CONTENT']: 
    9896                for child in self.CHILDREN: 
    99                     if child == att:                      
    100                         #found a match. 
    101                         if type(self.CHILDREN[child][0]) is not list: 
    102                             ename=self.CHILDREN[child][0]#Element Name     
    103                         etype = self.CHILDREN[child][1] #Element Type 
    104                         if type(self.__dict__[att])  is list: 
    105                             for item in self.__dict__[att]: 
    106                                 ename = self._getReverseSubsType(type(item).__name__) 
     97                    if child == att: 
     98                        parserobjects=[] 
     99                        if type(self.__dict__[att]) is list: 
     100                            for a in self.__dict__[att]: 
     101                                parserobjects.append(a) 
     102                        else: 
     103                            parserobjects.append(self.__dict__[att]) 
     104                        for po in parserobjects: 
     105                            if type(self.CHILDREN[child][0]) is not list: 
     106                                ename=self.CHILDREN[child][0] 
     107                            else: 
     108                                ename = self._getReverseSubsType(type(po).__name__) 
     109                            if len(self.CHILDREN[child])==3: 
     110                                ename2=self.CHILDREN[child][2] 
     111                                parentfrag=ET.Element(ename2) 
    107112                                frag=ET.Element(ename) 
    108                                 item.toXML(frag) 
     113                                po.toXML(frag) 
     114                                parentfrag.append(frag) 
     115                                csmlfrag.append(parentfrag) 
     116                            else: 
     117                                frag=ET.Element(ename) 
     118                                po.toXML(frag) 
    109119                                csmlfrag.append(frag) 
    110                         elif len(self.CHILDREN[child])==3: 
    111                           ename2=self.CHILDREN[child][2] 
    112                           parentfrag=ET.Element(ename) 
    113                           frag=ET.Element(ename2) 
    114                           self.__dict__[att].toXML(frag) 
    115                           parentfrag.append(frag) 
    116                           csmlfrag.append(parentfrag) 
    117                           
    118                         else: 
    119                           #this if handles the case eg in FeatureCollection where child maybe one of several types eg [GridFeature, PointFeature] etc. 
    120                           if type(self.CHILDREN[child][0]) is list: 
    121                             item=self.__dict__[att] 
    122                             ename = self._getReverseSubsType(type(item).__name__)  
    123                           else: 
    124                             ename=self.CHILDREN[child][0] 
    125                           frag=ET.Element(ename) 
    126                           self.__dict__[att].toXML(frag) 
    127                           csmlfrag.append(frag) 
    128                              
    129                             
    130120        return csmlfrag 
    131121         
    132122    def fromXML(self,csmlfrag): 
    133         ######## output for testing purposes ############### 
    134         #if hasattr(self, 'CHILDREN'): 
    135             #print "ELEMENT %s"%csmlfrag.tag 
    136             #for child in self.CHILDREN: 
    137                 #print child        
    138          ####################################### 
    139123        # deal with attributes, e.g. gml id's 
    140         if csmlfrag.tag == '{http://ndg.nerc.ac.uk/csml}ReferenceableGridCoverage': 
    141             print 'RG DETAILS - from XML' 
    142124        if csmlfrag.text is not None: 
    143125                self.CONTENT = csmlfrag.text 
    144                 if csmlfrag.tag == '{http://ndg.nerc.ac.uk/csml}value': 
    145                     print 'content %s'%self.CONTENT 
    146126        for item in csmlfrag.items(): 
    147127            if item[0] in self.ATTRIBUTES: 
     
    152132            #iterate through expected CHILDREN 
    153133            for child in self.CHILDREN: 
    154                 ename = self.CHILDREN[child][0] #Element Name                     
    155                 if frag.tag == ename: 
    156                     etype = self.CHILDREN[child][1] 
    157                     childobj=eval(etype)() 
    158                     if len(self.CHILDREN[child])==3: 
    159                         if frag[:] != []: 
    160                             childobj.fromXML(frag[0]) 
    161                     else: 
    162                         childobj.fromXML(frag) 
    163                     if hasattr(self, child): 
    164                         if type(self.__dict__[child]) is not list: 
    165                             tmp=self.__dict__[child] 
    166                             setattr(self, child, [tmp]) #convert to list 
    167                         self.__dict__[child].append(childobj) 
    168                     else: 
    169                         setattr(self, child, childobj) 
    170                  
    171                 if type(ename) is list: # e.g. FeatureCollection where it can be GridFeature, PointFeature etc.. 
    172                     print 'list for ename: %s'%ename 
    173                     print frag.tag 
    174                     if frag.tag in ename: 
    175                         etype=self._getSubstitutionType(frag.tag) 
     134                #get element name 
     135                if len(self.CHILDREN[child])==3: 
     136                    ename = self.CHILDREN[child][2] 
     137                    ename2 = self.CHILDREN[child][0] 
     138                     
     139                else: 
     140                    ename = self.CHILDREN[child][0]  
     141                    ename2=None 
     142                #if there are options, then find the name that matches the frag 
     143                if ename2 is not None: 
     144                    if frag[:] != []: 
     145                        for subfrag in frag[:]: 
     146                            etype=None 
     147                            if type(ename2) is list: 
     148                                if subfrag.tag in ename2: 
     149                                    etype=self._getSubstitutionType(subfrag.tag) 
     150                            if subfrag.tag==ename2: 
     151                                etype=self.CHILDREN[child][1] 
     152                            if etype: 
     153                                childobj=eval(etype)() 
     154                                if len(self.CHILDREN[child])==3: 
     155                                    if frag[:] != []: 
     156                                        childobj.fromXML(subfrag) 
     157                                else: 
     158                                    childobj.fromXML(frag) 
     159                                #set this object to be an attribute of the 'parent' (self) object 
     160                                if hasattr(self, child): 
     161                                    if type(self.__dict__[child]) is not list: 
     162                                        tmp=self.__dict__[child] 
     163                                        setattr(self, child, [tmp]) #convert to list 
     164                                    self.__dict__[child].append(childobj) 
     165                                else: 
     166                                    setattr(self, child, childobj) 
     167                else: 
     168                    etype=None 
     169                    if type(ename) is list: 
     170                        if frag.tag in ename: 
     171                            etype=self._getSubstitutionType(frag.tag) 
     172                    elif frag.tag==ename: 
     173                        etype=self.CHILDREN[child][1] 
     174                    if etype: 
    176175                        childobj=eval(etype)() 
    177                         childobj.fromXML(frag) 
     176                        if len(self.CHILDREN[child])==3: 
     177                            if frag[:] != []: 
     178                                childobj.fromXML(frag[0]) 
     179                        else: 
     180                            childobj.fromXML(frag) 
     181                        #set this object to be an attribute of the 'parent' (self) object 
    178182                        if hasattr(self, child): 
    179183                            if type(self.__dict__[child]) is not list: 
     
    184188                            setattr(self, child, childobj) 
    185189 
     190                 
    186191class csString(csElement): 
    187192    pass 
     
    206211    def __init__(self, **kwargs): 
    207212        AbstractFeature.__init__(self,**kwargs) 
    208         children={'members':[[CSML('GridFeature'),CSML('PointFeature')], 'AbstractFeature']} 
    209         addchildren(self,children) 
    210213 
    211214class domainSet(AbstractGML,AssociationAttributeGroup,csElement): 
     
    244247    def __init__(self, **kwargs): 
    245248        AbstractDiscreteCoverage.__init__(self,**kwargs) 
    246         children={'referenceableGridDomain':[CSML('referenceableGridDomain'), 'ReferenceableGrid' , CSML('ReferenceableGrid')]} 
    247         addchildren(self,children) 
    248     def toXML(self,csmlfrag): 
    249         AbstractDiscreteCoverage.toXML(self,csmlfrag)    
    250     def fromXML(self,csmlfrag): 
    251         AbstractDiscreteCoverage.fromXML(self,csmlfrag)    
     249        children={'referenceableGridDomain':[CSML('ReferenceableGrid'),'ReferenceableGrid' ,CSML('referenceableGridDomain') ]} 
     250        addchildren(self,children) 
    252251 
    253252class Definition(AbstractGML): 
     
    266265    def __init__(self, **kwargs): 
    267266        AbstractFeature.__init__(self,**kwargs) 
    268         children={'time':[CSML('time'), 'csString'], 'value':[CSML('value'), 'ReferenceableGridCoverage', CSML('ReferenceableGridCoverage')], 'parameter':[CSML('parameter'), 'Phenomenon']} 
     267        #children={'time':[CSML('time'), 'csString'], 'value':[CSML('value'), 'ReferenceableGridCoverage', CSML('ReferenceableGridCoverage')], 'parameter':[CSML('parameter'), 'Phenomenon']} 
     268        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']} 
    269269        addchildren(self,children) 
    270270 
     
    296296    def __init__(self,**kwargs): 
    297297        AbstractFeatureCollection.__init__(self,**kwargs) 
     298        children={'members':[[CSML('GridFeature'),CSML('PointFeature')], 'AbstractFeature', GML('featureMembers')]} 
     299        addchildren(self,children) 
    298300    def _getSubstitutionType(self,tag): 
    299301        if tag==CSML('GridFeature'): 
  • TI02-CSML/branches/CSML2/test.xml

    r1823 r1831  
    2424        </NASAAmesExtract> 
    2525        <gml:FeatureCollection> 
     26            <gml:featureMembers> 
    2627            <GridFeature gml:id="feature1"> 
    2728                <time></time> 
    28                 <value></value> 
     29                <value> 
     30                     <ReferenceableGridCoverage> 
     31                           <referenceableGridDomain> 
     32                                 <ReferenceableGrid  gml:description ="mygrid" dimension="3" gml:id="ID004"  > 
     33                                 </ReferenceableGrid> 
     34                           </referenceableGridDomain> 
     35                      </ReferenceableGridCoverage> 
     36               </value> 
    2937                <parameter></parameter> 
    3038            </GridFeature> 
    31             <GridFeature> 
     39            <GridFeature gml:id="feature2"> 
    3240                <value> 
    33                     <ReferencableGridCoverage> 
     41                    <ReferenceableGridCoverage> 
    3442                        <referenceableGridDomain> 
    35                           <referenceableGrid  gml:description ="mygrid" dimension="2" gml:id="ID004"  > 
    36                             </referenceableGrid> 
     43                            <ReferenceableGrid gml:id="ID001" srsName="urn:ogc:def:crs:EPSG:6.6:4326" dimension="2"> 
     44                                <gml:limits> 
     45                                    <gml:GridEnvelope> 
     46                                        <gml:low>0 0</gml:low> 
     47                                        <gml:high>7 4</gml:high> 
     48                                    </gml:GridEnvelope> 
     49                                </gml:limits> 
     50                                <gml:axisLabels>x y</gml:axisLabels> 
     51                                <gml:coordTransformTable> 
     52                                    <gml:GridCoordinatesTable> 
     53                                        <gml:gridPoints> 
     54                                            <gml:GridPointDescription> 
     55                                                <gml:posList> 
     56                                                    13.5 53.1   24.9 48.7   32.4 46.2   37.7 44.7   41.5 43.9   46.8 43.3   54.4 43.1   65.7 44.0 
     57                                                    13.5 46.2   24.9 43.2   32.4 41.5   37.7 40.6   41.5 40.2   46.8 40.0   54.4 40.3   65.7 41.7 
     58                                                    13.5 37.1   24.9 36.1   32.4 35.6   37.7 35.5   41.5 35.7   46.8 36.0   54.4 37.1   65.7 39.5 
     59                                                    13.5 30.4   24.9 30.2   32.4 30.4   37.7 30.7   41.5 31.1   46.8 32.0   54.4 33.8   65.7 37.2 
     60                                                    13.5 24.3   24.9 24.8   32.4 25.3   37.7 26.0   41.5 26.6   46.8 27.7   54.4 29.7   65.7 33.4</gml:posList> 
     61                                                <gml:sequenceRule axisOrder="+1 -2">Linear</gml:sequenceRule> 
     62                                            </gml:GridPointDescription> 
     63                                        </gml:gridPoints> 
     64                                    </gml:GridCoordinatesTable> 
     65                                </gml:coordTransformTable> 
     66                                </ReferenceableGrid> 
    3767                        </referenceableGridDomain> 
    38                     </ReferencableGridCoverage> 
     68                    </ReferenceableGridCoverage> 
    3969                </value> 
    4070                <time>12 13 14 15</time> 
    4171                <parameter gml:id='blah' xlink:href='http://someurl#blah' xlink:role='somerole'> </parameter> 
    4272            </GridFeature> 
     73        </gml:featureMembers> 
    4374        </gml:FeatureCollection> 
    4475</Dataset> 
Note: See TracChangeset for help on using the changeset viewer.