source: TI02-CSML/branches/CSML2/csParser.py @ 1846

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/branches/CSML2/csParser.py@1846
Revision 1846, 24.3 KB checked in by domlowe, 13 years ago (diff)

classes for all features added (not yet done coverages for all features)

Line 
1import cElementTree as ET
2import elementtree.ElementTree as etree
3import parser_extra
4import sys
5'''CSML v2 Parser ''' 
6
7#this map needs updating for V2
8etree._namespace_map.update({'http://www.opengis.net/om': 'om', 'http://www.opengis.net/swe': 'swe',  'http://www.opengis.net/gml': 'gml','http://ndg.nerc.ac.uk/csml' : 'csml', 'http://www.w3.org/1999/xlink':'xlink'})
9
10nsCSML = 'http://ndg.nerc.ac.uk/csml'
11nsGML = 'http://www.opengis.net/gml'
12nsOM = 'http://www.opengis.net/om'
13nsXLINK = 'http://www.w3.org/1999/xlink'
14nsXML = 'http://ndg.nerc.ac.uk/csml'
15nsMOLES='http://ndg.nerc.ac.uk/moles'
16nsSWE='http://www.opengis.net/swe'
17   
18def myQName(uri,tag):
19    return "{"+uri+"}"+tag
20
21def CSML(tag):
22    return myQName(nsCSML,tag)
23
24def GML(tag):
25    return myQName(nsGML,tag)
26
27def SWE(tag):
28    return myQName(nsSWE,tag)
29
30def XLINK(tag):
31    return myQName(nsXLINK,tag)
32
33def addchildren(obj, dict):
34    ''' merges (adds) dictionary to existing self.CHILDREN dictionary '''
35    dict1 = dict
36    if hasattr(obj, 'CHILDREN'):
37      dict2=obj.CHILDREN
38    else:
39      dict2={}
40    dict3={}
41    for item in dict1:
42        dict3[item] =dict1[item]
43    for item in dict2:
44        dict3[item] =dict2[item]
45    obj.CHILDREN=dict3
46   
47
48def addatts(obj, atts):
49  ''' merges self.ATTRIBUTES'''
50  if hasattr(obj, 'ATTRIBUTES'):
51    for att in atts:
52        obj.ATTRIBUTES.append(att)
53  else:
54    obj.ATTRIBUTES=atts
55
56
57#Some variable definitions: these things are often repeated so store in variables.
58FILEFORMATS=[CSML('NetCDFExtract'),CSML('NASAAmesExtract'), CSML('GRIBExtract'),CSML('CDMLExtract'), CSML('RawFileExtract')]
59 
60
61class csElement(object):
62    ''' main csElement class - all other elements inherit from this baseclass 
63    all the from/to XML conversion is done by this class'''
64   
65    def __init__(self, **kwargs):
66        if not hasattr(self, 'ATTRIBUTES'):
67            self.ATTRIBUTES=[]
68           
69       
70    def __removeURI(self, qname):
71        try:
72            attname = qname.split('}')[1]
73        except IndexError:
74            attname = qname
75        return attname
76       
77    def _getSubstitutionType(self,tag):
78        print 'splitting tag'
79        return tag.split('}')[1]
80       
81   
82    def _getReverseSubsType(self, typename):
83        return typename
84   
85    def toXML(self, csmlfrag):
86        #process self and convert to XML
87        if hasattr(self, 'CONTENT'):
88            if self.CONTENT is not None: csmlfrag.text=self.CONTENT
89        if hasattr(self, 'ATTRIBUTES'):
90            for item in self.__dict__:
91                if item in self.ATTRIBUTES:
92                    csmlfrag.set(item, self.__dict__[item])
93            for item in self.__dict__:
94                if GML(item) in self.ATTRIBUTES:
95                    csmlfrag.set(GML(item), self.__dict__[item])       
96    # self.CHILDREN (recursive - calls the toXML method of children
97        for att in self.__dict__:
98            if att not in ['ATTRIBUTES', 'CHILDREN', 'CONTENT']:
99                for child in self.CHILDREN:
100                    if child == att:
101                        parserobjects=[]
102                        if type(self.__dict__[att]) is list:
103                            for a in self.__dict__[att]:
104                                parserobjects.append(a)
105                        else:
106                            parserobjects.append(self.__dict__[att])
107                        parentfrag=None
108                        if len(self.CHILDREN[child])>=3:
109                                ename2=self.CHILDREN[child][2]
110                                parentfrag=ET.Element(ename2)
111                        for po in parserobjects:
112                            if type(self.CHILDREN[child][0]) is not list:
113                                ename=self.CHILDREN[child][0]
114                            else:
115                                ename = self._getReverseSubsType(type(po).__name__)
116                            if len(self.CHILDREN[child])==3:
117                                frag=ET.Element(ename)
118                                po.toXML(frag)
119                                parentfrag.append(frag)
120                                appendLater=True
121                            elif len(self.CHILDREN[child])>=4:
122                                if self.CHILDREN[child][3]==1:
123                                    frag=ET.Element(ename)
124                                    po.toXML(frag)
125                                    parentfrag.append(frag)
126                                    csmlfrag.append(parentfrag)
127                                    parentfrag=ET.Element(parentfrag.tag)
128                                    appendLater=False
129                            else:
130                                frag=ET.Element(ename)
131                                po.toXML(frag)
132                                csmlfrag.append(frag)
133                                appendLater=True
134                        if appendLater==True and parentfrag != None:
135                            csmlfrag.append(parentfrag)
136        return csmlfrag
137       
138    def fromXML(self,csmlfrag):
139        # deal with attributes, e.g. gml id's
140        if csmlfrag.text is not None:
141                self.CONTENT = csmlfrag.text
142        for item in csmlfrag.items():
143            if item[0] in self.ATTRIBUTES:
144                setattr(self, item[0], item[1])
145        # self.CHILDREN (recursive - calls the fromXML method of children
146        for frag in csmlfrag[:]:
147            #for each child element
148            #iterate through expected CHILDREN
149            for child in self.CHILDREN:
150                #get element name
151                if len(self.CHILDREN[child])>=3:
152                    ename = self.CHILDREN[child][2]
153                    ename2 = self.CHILDREN[child][0]
154                   
155                else:
156                    ename = self.CHILDREN[child][0] 
157                    ename2=None
158                #if there are options, then find the name that matches the frag
159                if ename2 is not None:
160                    if frag[:] != []:
161                        for subfrag in frag[:]:
162                            etype=None
163                            if type(ename2) is list:
164                                if subfrag.tag in ename2:
165                                    etype=self._getSubstitutionType(subfrag.tag)
166                            if subfrag.tag==ename2:
167                                etype=self.CHILDREN[child][1]
168                            if etype:
169                                childobj=eval(etype)()
170                                if len(self.CHILDREN[child])>=3:
171                                    if frag[:] != []:
172                                        childobj.fromXML(subfrag)
173                                else:
174                                    childobj.fromXML(frag)
175                                #set this object to be an attribute of the 'parent' (self) object
176                                if hasattr(self, child):
177                                    if type(self.__dict__[child]) is not list:
178                                        tmp=self.__dict__[child]
179                                        setattr(self, child, [tmp]) #convert to list
180                                    self.__dict__[child].append(childobj)
181                                else:
182                                    setattr(self, child, childobj)
183                else:
184                    etype=None
185                    if type(ename) is list:
186                        if frag.tag in ename:
187                            etype=self._getSubstitutionType(frag.tag)
188                    elif frag.tag==ename:
189                        etype=self.CHILDREN[child][1]
190                    if etype:
191                        childobj=eval(etype)()
192                        if len(self.CHILDREN[child])>=3:
193                            if frag[:] != []:
194                                childobj.fromXML(frag[0])
195                        else:
196                            childobj.fromXML(frag)
197                        #set this object to be an attribute of the 'parent' (self) object
198                        if hasattr(self, child):
199                            if type(self.__dict__[child]) is not list:
200                                tmp=self.__dict__[child]
201                                setattr(self, child, [tmp]) #convert to list
202                            self.__dict__[child].append(childobj)
203                        else:
204                            setattr(self, child, childobj)
205
206               
207class csString(csElement):
208    pass
209
210class AbstractGML(csElement):
211    def __init__(self, **kwargs):
212        a=[GML('id'), GML('description'), GML('name'), GML('MetaDataProperty')]
213        addatts(self,a)
214
215class AssociationAttributeGroup(csElement):
216    def __init__(self, **kwargs):
217        a =[XLINK('href'),XLINK('role'), XLINK('arcrole'),XLINK('title'), XLINK('show'), XLINK('actuate')] 
218        addatts(self,a)
219
220class SRSReferenceGroup(csElement):
221    def __init__(self, **kwargs):
222        a =['srsName','srsDimension'] 
223        addatts(self,a)
224       
225class SRSInformationGroup(csElement):
226    def __init__(self, **kwargs):
227        a =['uomLabels','axisLabels'] 
228        addatts(self,a)
229
230class ArrayDescriptor(AbstractGML, csElement):
231    def __init__(self,**kwargs):
232        AbstractGML.__init__(self,**kwargs)
233        children={'arraySize':[CSML('arraySize'), 'csString'], 'uom':[CSML('uom'),'csString'], 'numericType':[CSML('numericType'),'csString'], 'regExpTransform':[CSML('regExpTransform'),'csString'], 'numericTransform':[CSML('numericTransform'),'csString']}
234        addchildren(self,children)
235
236class DirectPosition(AbstractGML, SRSReferenceGroup,SRSInformationGroup,csElement):
237    def __init__(self, **kwargs):
238        AbstractGML.__init__(self,**kwargs)
239
240
241class Envelope(AbstractGML,SRSReferenceGroup, csElement):
242    def __init__(self, **kwargs):
243        SRSReferenceGroup.__init__(self,**kwargs)
244        AbstractGML.__init__(self,**kwargs)
245        children={'lowerCorner':[GML('lowerCorner'), 'DirectPosition'],'upperCorner':[GML('upperCorner'), 'DirectPosition']}
246        addchildren(self,children)
247
248
249class AbstractFeature(AbstractGML,csElement):
250    def __init__(self, **kwargs):
251        AbstractGML.__init__(self,**kwargs)
252        children={'boundedBy':[GML('boundedBy'), 'Envelope']}
253        addchildren(self,children)
254
255class AbstractFeatureCollection(AbstractFeature,csElement):
256    def __init__(self, **kwargs):
257        AbstractFeature.__init__(self,**kwargs)
258
259class DomainSet(AbstractGML,AssociationAttributeGroup,csElement):
260    def __init__(self, **kwargs):
261        AbstractGML.__init__(self,**kwargs)
262        addchildren(self,{})
263
264class AggregatedArray(ArrayDescriptor,csElement):
265    def __init__(self, **kwargs):
266        ArrayDescriptor.__init__(self,**kwargs)
267        children={'aggType':[CSML('aggType'),'csString'], 'aggIndex':[CSML('aggIndex'),'csString'],'components':[FILEFORMATS, 'ArrayDescriptor',CSML('component')]}
268        addchildren(self,children)
269#'component':[CSML:('component'), 'ArrayDescriptor', CSML('component')],
270class MeasureOrNullList(AbstractGML,csElement):
271    def __init__(self, **kwargs):
272        AbstractGML.__init__(self,**kwargs)
273        children={}
274        addchildren(self,children)
275       
276class CompositeValue(AbstractGML,csElement):
277    def __init__(self, **kwargs):
278        AbstractGML.__init__(self,**kwargs)
279        children={'measures':[GML('measure'),'csString',GML('valueComponents')]}
280        addchildren(self,children)
281       
282class DataBlock(AbstractGML,csElement):
283    def __init__(self, **kwargs):
284        AbstractGML.__init__(self,**kwargs)
285        children={'doubleOrNullTupleList':[GML('doubleOrNullTupleList'),'csString'],'rangeParameters':[GML('CompositeValue'), 'CompositeValue', GML('rangeParameters')]}
286        addchildren(self,children)
287
288class RangeSet(AbstractGML,AssociationAttributeGroup,csElement):
289    def __init__(self, **kwargs):
290        AbstractGML.__init__(self,**kwargs)
291        children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList'],        'dataBlock':[GML('DataBlock'),'DataBlock'],'arrayDescriptor':[FILEFORMATS, 'ArrayDescriptor'],  'aggregatedArray':[CSML('AggregatedArray'), 'AggregatedArray']}
292        addchildren(self,children)
293
294class MultiPoint(csElement):
295    def __init__(self, **kwargs):
296        children={'pointMember':[GML('pointMember'), 'csString'],'pointMembers':[GML('pointMember'), 'csString']}
297        a=['srsDimension']
298        addatts(self,a)
299        addchildren(self,children)
300
301class PointDomain(DomainSet, MultiPoint,csElement):
302    def __init__(self, **kwargs):
303        DomainSet.__init__(self,**kwargs)
304        MultiPoint.__init__(self,**kwargs)
305        children={}
306        addchildren(self,children)
307
308class AbstractCoverage(AbstractFeature, csElement):
309    def __init__(self, **kwargs):
310        AbstractFeature.__init__(self,**kwargs)
311
312class AbstractDiscreteCoverage(AbstractCoverage, csElement):
313    def __init__(self, **kwargs):
314        AbstractCoverage.__init__(self,**kwargs)
315        addchildren(self,{})
316       
317       
318class SpatialOrTemporalPositionList(AbstractGML,csElement):
319    def __init__(self, **kwargs):
320        AbstractGML.__init__(self,**kwargs)
321        children={'coordinateList':[GML('coordinateList'),'csString'], 'timePositionList':[CSML('timePositionList'),'csString']}
322        addchildren(self,children)
323
324class GridOrdinateDescription(AbstractGML,csElement):
325    def __init__(self, **kwargs):
326        AbstractGML.__init__(self,**kwargs)
327        children={'coordAxisLabel':[GML('coordAxisLabel'), 'csString'], 'coordAxisValues':[GML('SpatialOrTemporalPositionList'),'SpatialOrTemporalPositionList',GML('coordAxisValues')], 'gridAxesSpanned':[GML('gridAxesSpanned'), 'csString'], 'sequenceRule':[GML('sequenceRule'),'SequenceRuleType']}
328        addchildren(self,children)
329
330class SequenceRuleType(csElement):
331    def __init__(self, **kwargs):
332        a=['axisOrder']
333        addatts(self,a)
334        children={}
335        addchildren(self,children)
336
337class GridPointDescription(AbstractGML,csElement):
338    def __init__(self, **kwargs):
339        AbstractGML.__init__(self,**kwargs)
340        children={'posList':[GML('posList'),'csString'],'sequenceRule':[GML('sequenceRule'),'SequenceRuleType']}
341        addchildren(self,children)
342
343
344class GridCoordinatesTable(AbstractGML,csElement):
345    def __init__(self,**kwargs):
346        '''the additional value '1' in the children dictionary is used to signify that the elements must be nested as:
347        <gml:ordinate>
348            <gml:GridOrdinateDescription>
349        </gml:ordinate>
350        <gml:ordinate>
351            <gml:GridOrdinateDescription>
352        </gml:ordinate>
353       
354        not as:
355        <gml:ordinate>
356            <gml:GridOrdinateDescription>
357            <gml:GridOrdinateDescription>
358        </gml:ordinate> '''
359        AbstractGML.__init__(self,**kwargs)
360        children={'gridOrdinates':[GML('GridOrdinateDescription'), 'GridOrdinateDescription',GML('gridOrdinate'),1], 'gridPoints':[GML('GridPointDescription'),'GridPointDescription',GML('gridPoints')]}
361        addchildren(self,children)
362       
363class ReferenceableGrid(AbstractGML, AssociationAttributeGroup, csElement):
364    def __init__(self, **kwargs):
365        AbstractGML.__init__(self,**kwargs)
366        AssociationAttributeGroup.__init__(self,**kwargs)
367        children={'coordTransformTable':[GML('GridCoordinatesTable'), 'GridCoordinatesTable', GML('coordTransformTable')]}
368        addchildren(self,children)
369        a=['dimension']
370        addatts(self,a)
371
372class ReferenceableGridCoverage(AbstractDiscreteCoverage, csElement):
373    def __init__(self, **kwargs):
374        AbstractDiscreteCoverage.__init__(self,**kwargs)
375        children={'referenceableGridDomain':[CSML('ReferenceableGrid'),'ReferenceableGrid' ,CSML('referenceableGridDomain') ]}
376        addchildren(self,children)
377       
378class PointCoverage(AbstractDiscreteCoverage, csElement):
379    def __init__(self, **kwargs):
380        AbstractDiscreteCoverage.__init__(self,**kwargs)
381        children={'pointDomain':[CSML('PointDomain'),'PointDomain' ,CSML('pointDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
382        addchildren(self,children)
383
384class Definition(AbstractGML):
385    def __init__(self, **kwargs):
386        AbstractGML.__init__(self,**kwargs)
387        addchildren(self,{})
388
389class Phenomenon(Definition,AssociationAttributeGroup):
390    def __init__(self, **kwargs):
391        Definition.__init__(self,**kwargs)
392        AssociationAttributeGroup.__init__(self,**kwargs)
393        children = {'':[CSML(''), '']}   
394        addchildren(self,children)
395
396#class AlternatePointFeature(AbstractFeature, csElement):
397    #def __init__(self, **kwargs):
398        #AbstractFeature.__init__(self,**kwargs)
399        #children={}
400        #addchildren(self,children)
401
402class PointFeature(AbstractFeature, csElement):
403    def __init__(self, **kwargs):
404        AbstractFeature.__init__(self,**kwargs)
405        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('PointCoverage'), 'PointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
406        addchildren(self,children)
407
408class PointCollectionFeature(AbstractFeature, csElement):
409    def __init__(self, **kwargs):
410        AbstractFeature.__init__(self,**kwargs)
411        children={'time':[CSML('time'), 'csString'], 'value':[CSML('MultiPointCoverage'), 'MultiPointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
412        addchildren(self,children)
413
414class PointSeriesFeature(AbstractFeature, csElement):
415    def __init__(self, **kwargs):
416        AbstractFeature.__init__(self,**kwargs)
417        children={'location':[CSML('location'), 'csString'], 'value':[CSML('PointSeriesCoverage'), 'PointSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
418        addchildren(self,children)
419
420
421class GridFeature(AbstractFeature, csElement):
422    def __init__(self, **kwargs):
423        AbstractFeature.__init__(self,**kwargs)
424        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
425        addchildren(self,children)
426
427class GridSeriesFeature(AbstractFeature, csElement):
428    def __init__(self, **kwargs):
429        AbstractFeature.__init__(self,**kwargs)
430        children={'value':[CSML('GridSeriesCoverage'), 'GridSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
431        addchildren(self,children)
432
433class ProfileFeature(AbstractFeature, csElement):
434    def __init__(self, **kwargs):
435        AbstractFeature.__init__(self,**kwargs)
436        children={'time':[CSML('time'), 'csString'],'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileCoverage'), 'ProfileCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
437        addchildren(self,children)
438
439class ProfileSeriesFeature(AbstractFeature, csElement):
440    def __init__(self, **kwargs):
441        AbstractFeature.__init__(self,**kwargs)
442        children={'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
443        addchildren(self,children)
444
445class RaggedProfileSeriesFeature(AbstractFeature, csElement):
446    def __init__(self, **kwargs):
447        AbstractFeature.__init__(self,**kwargs)
448        children={'location':[CSML('location'), 'csString'], 'profileLength':[CSML('profileLength'), 'csString'],'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
449        addchildren(self,children)
450
451class RaggedSectionFeature(AbstractFeature, csElement):
452    def __init__(self, **kwargs):
453        AbstractFeature.__init__(self,**kwargs)
454        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'profileLength':[CSML('profileLength'),'csString'],'value':[CSML('RaggedSectionCoverage'), 'RaggedSectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
455        addchildren(self,children)
456
457class SectionFeature(AbstractFeature, csElement):
458    def __init__(self, **kwargs):
459        AbstractFeature.__init__(self,**kwargs)
460        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
461        addchildren(self,children)
462
463class ScanningRadarFeature(AbstractFeature, csElement):
464    def __init__(self, **kwargs):
465        AbstractFeature.__init__(self,**kwargs)
466        children={'elevation':[CSML('elevation'), 'csString'], 'value':[CSML('ScanningRadarCoverage'), 'ScanningRadarCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
467        addchildren(self,children)
468
469class SwathFeature(AbstractFeature, csElement):
470    def __init__(self, **kwargs):
471        AbstractFeature.__init__(self,**kwargs)
472        children={'eqCrossLon':[CSML('eqCrossLon'), 'csString'],'eqCrossTime':[CSML('eqCrossTime'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
473        addchildren(self,children)
474
475class TrajectoryFeature(AbstractFeature, csElement):
476    def __init__(self, **kwargs):
477        AbstractFeature.__init__(self,**kwargs)
478        children={'value':[CSML('TrajectoryCoverage'), 'TrajectoryCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
479        addchildren(self,children)
480
481       
482class FileExtract(ArrayDescriptor, csElement):
483    def __init__(self,**kwargs):
484        ArrayDescriptor.__init__(self,**kwargs)
485        children= {'fileName':[CSML('fileName'), 'csString']}
486        addchildren(self,children)
487
488class NetCDFExtract(FileExtract, csElement):
489    def __init__(self,**kwargs):
490        FileExtract.__init__(self, **kwargs)
491        children={'variableName':[CSML('variableName'), 'csString']}
492        addchildren(self,children)
493       
494class NASAAmesExtract(FileExtract, csElement):
495    def __init__(self,**kwargs):
496        FileExtract.__init__(self, **kwargs)
497        children={'variableName':[CSML('variableName'), 'csString'], 'index':[CSML('index'),'csString']}
498        addchildren(self,children)
499
500class FeatureCollection(AbstractFeatureCollection,csElement):
501    def __init__(self,**kwargs):
502        AbstractFeatureCollection.__init__(self,**kwargs)
503        children={'members':[[CSML('GridFeature'),CSML('PointFeature')], 'AbstractFeature', GML('featureMembers')]}
504        addchildren(self,children)
505    def _getSubstitutionType(self,tag):
506        if tag==CSML('GridFeature'):
507            return 'GridFeature'
508        elif tag==CSML('PointFeature'):
509            return 'PointFeature'
510        else: return 'AbstractFeature'
511    def _getReverseSubsType(self, typename):
512        if typename== 'GridFeature':
513            return CSML('GridFeature')
514        elif typename == 'PointFeature':
515            return CSML('PointFeature')
516        else: return CSML('AbstractFeature')
517
518       
519class Dataset(AbstractGML, csElement):   
520    ''' Dataset class, needed as root of tree'''
521    def __init__(self, **kwargs):
522        AbstractGML.__init__(self,**kwargs)
523        #children = {'ncExtract':[CSML('NetCDFExtract'), 'NetCDFExtract'], 'featureCollection':[CSML('featureCollection') ,'FeatureCollection']}
524        children = {'featureCollection':[GML('FeatureCollection') ,'FeatureCollection'],'fileExtracts':[FILEFORMATS, 'ArrayDescriptor']}
525        addchildren(self,children)
526    def toXML(self):
527        csmlfrag=ET.Element(CSML('Dataset'))
528        csElement.toXML(self, csmlfrag)
529        return csmlfrag
530    def _getSubstitutionType(self,tag):
531        if tag==CSML('NetCDFExtract'):
532            return 'NetCDFExtract'
533        elif tag==CSML('NASAAmesExtract'):
534            return 'NASAAmesExtract'
535        else: return 'ArrayDescriptor'
536    def _getReverseSubsType(self, typename):
537        if typename== 'NetCDFExtract':
538            return CSML('NetCDFExtract')
539        elif typename == 'NASAAmesExtract':
540            return CSML('NASAAmesExtract')
541        else: return CSML('ArrayDescriptor')
542       
543        return typename
544
545def main():
546    '''round trip for testing purposes:'''
547    print '\n'
548    tree=ET.ElementTree(file='test.xml')
549    ds=Dataset()
550    ds.fromXML(tree.getroot())
551    csmltree=ds.toXML()
552    #print csmltree
553   
554    csmlout=parser_extra.PrettyPrint(csmltree)
555    csmlout=parser_extra.removeInlineNS(csmlout)
556    print '\n %s'% csmlout
557    #for member in ds.featureCollection.members:
558      #print dir(member.value)
559       
560
561if __name__=='__main__':
562    main()
Note: See TracBrowser for help on using the repository browser.