source: TI02-CSML/trunk/csml/parser.py @ 2052

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI02-CSML/trunk/csml/parser.py@2052
Revision 2052, 40.8 KB checked in by domlowe, 15 years ago (diff)

Demo code to show creation of PointSeries? feature using CSML V2 parser. Also various small fixes to parser

Line 
1import cElementTree as ET
2import elementtree.ElementTree as etree
3import parser_extra
4import sys, traceback
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        for kw in kwargs:
67            self.__setattr__(kw, kwargs[kw])
68        if not hasattr(self, 'ATTRIBUTES'):
69            self.__dict__['ATTRIBUTES']=[]
70   
71    #The __setattr__ and __getattribute__ special methods have been overridden.
72    #This is so that attributes can be called by their fully qualified name internally
73    #while being referenced by their short name externally.
74    # so 'id' and {'http://www.opengis.net/gml'}id always have the same value
75    #you can set either of them at any time and the other will be kept in sync.
76       
77    def __setattr__(self, name, value):
78        if hasattr(self, CSML(name)):
79            object.__setattr__(self, CSML(name), value)
80            object.__setattr__(self, name, value)
81        elif hasattr(self,GML(name)):
82            object.__setattr__(self, GML(name), value)
83            object.__setattr__(self, name, value)
84        elif hasattr(self,XLINK(name)):
85            object.__setattr__(self, XLINK(name), value)
86            object.__setattr__(self, name, value)
87        else:
88            if hasattr(self, 'ATTRIBUTES'):
89                if CSML(name) in self.__dict__['ATTRIBUTES']:
90                    object.__setattr__(self, CSML(name), value)
91                    object.__setattr__(self, name, value)
92                elif GML(name) in self.__dict__['ATTRIBUTES']:
93                    object.__setattr__(self, GML(name), value)
94                    object.__setattr__(self, name, value)
95                elif XLINK(name) in self.__dict__['ATTRIBUTES']:
96                    object.__setattr__(self, XLINK(name), value)
97                    object.__setattr__(self, name, value)
98                elif name in self.__dict__['ATTRIBUTES']:
99                    object.__setattr__(self, name, value)
100                    try:
101                        name=name.split('}')[1]
102                    except IndexError:
103                        pass
104                    object.__setattr__(self, name, value)
105                else:
106                    object.__setattr__(self, name, value)
107            else:
108                    object.__setattr__(self, name, value)
109   
110    def __getattribute__(self, name):
111            if CSML(name) in object.__dict__:
112                return object.__getattribute__(self,CSML(name))
113            elif GML(name) in object.__dict__:
114                return object.__getattribute__(self,GML(name))
115            elif XLINK(name) in object.__dict__:
116                return object.__getattribute__(self,XLINK(name))
117            else:
118                return object.__getattribute__(self,name) 
119       
120    def __removeURI(self, qname):
121        try:
122            attname = qname.split('}')[1]
123        except IndexError:
124            attname = qname
125        return attname
126       
127    def _getSubstitutionType(self,tag):
128        return tag.split('}')[1]
129       
130   
131    def _getReverseSubsType(self, typename):
132        return typename
133   
134    def addChildElem(self, childname, childobj):
135        #sometimes you want to add a child element but don't know if there is one already. In which case you want to create a list of child objects.
136        if hasattr(self, childname):
137            currentattribute=getattr(self,childname)
138            if type(getattr(self,childname)) is list:
139                currentattribute.append(childobj)
140            else:
141                newlist=[currentattribute]
142                newlist.append(childobj)
143                setattr(self,childname, newlist)
144        else:
145            setattr(self,childname, childobj)
146
147    def toXML(self, csmlfrag, **kwargs):
148        #process self and convert to XML
149               
150        if hasattr(self, 'CONTENT'):
151            if self.CONTENT is not None: csmlfrag.text=self.CONTENT
152        if hasattr(self, 'ATTRIBUTES'):
153            for item in self.__dict__:
154                if item in self.ATTRIBUTES:                   
155                    csmlfrag.set(item, self.__dict__[item])
156            for item in self.__dict__:
157                if GML(item) in self.ATTRIBUTES:
158                    csmlfrag.set(GML(item), self.__dict__[item])       
159    # self.CHILDREN (recursive - calls the toXML method of children
160        for att in self.__dict__:
161            if att not in ['ATTRIBUTES', 'CHILDREN', 'CONTENT']:
162                for child in self.CHILDREN:
163                    if child == att:
164                        parserobjects=[]
165                        if type(self.__dict__[att]) is list:
166                            for a in self.__dict__[att]:
167                                parserobjects.append(a)
168                        else:
169                            parserobjects.append(self.__dict__[att])
170                        parentfrag=None
171                        if len(self.CHILDREN[child])>=3:
172                                ename2=self.CHILDREN[child][2]
173                                parentfrag=ET.Element(ename2)
174                        for po in parserobjects:
175                            if type(self.CHILDREN[child][0]) is not list:
176                                ename=self.CHILDREN[child][0]
177                            else:
178                                ename = self._getReverseSubsType(type(po).__name__)
179                            if len(self.CHILDREN[child])==3:
180                                frag=ET.Element(ename)
181                                po.toXML(frag)
182                                parentfrag.append(frag)
183                                appendLater=True
184                            elif len(self.CHILDREN[child])>=4:
185                                if self.CHILDREN[child][3]==1:
186                                    frag=ET.Element(ename)
187                                    po.toXML(frag)
188                                    parentfrag.append(frag)
189                                    csmlfrag.append(parentfrag)
190                                    parentfrag=ET.Element(parentfrag.tag)
191                                    appendLater=False
192                            else:
193                                frag=ET.Element(ename)
194                                try:
195                                    po.toXML(frag)
196                                except:
197                                    print 'PARSING ERROR - could not convert %s to XML'%frag
198                                    raise
199                                csmlfrag.append(frag)
200                                appendLater=True
201                        if appendLater==True and parentfrag != None:
202                            csmlfrag.append(parentfrag)
203        return csmlfrag
204       
205    def fromXML(self,csmlfrag):
206        # deal with attributes, e.g. gml id's
207        if csmlfrag.text is not None:
208                self.CONTENT = csmlfrag.text
209        for item in csmlfrag.items():
210            if item[0] in self.ATTRIBUTES:
211                setattr(self, item[0], item[1])
212        #self.CHILDREN (recursive - calls the fromXML method of children
213        for frag in csmlfrag[:]:
214            #for each child element
215            #iterate through expected CHILDREN
216            for child in self.CHILDREN:
217                #get element name
218                if len(self.CHILDREN[child])>=3:
219                    ename = self.CHILDREN[child][2]
220                    ename2 = self.CHILDREN[child][0]
221                   
222                else:
223                    ename = self.CHILDREN[child][0] 
224                    ename2=None
225                #if there are options, then find the name that matches the frag
226                if ename2 is not None:
227                    if frag[:] != []:
228                        for subfrag in frag[:]:
229                            etype=None
230                            if type(ename2) is list:
231                                if subfrag.tag in ename2:
232                                    etype=self._getSubstitutionType(subfrag.tag)
233                            if subfrag.tag==ename2:
234                                etype=self.CHILDREN[child][1]
235                            if etype:
236                                childobj=eval(etype)()
237                                if len(self.CHILDREN[child])>=3:
238                                    if frag[:] != []:
239                                        childobj.fromXML(subfrag)
240                                else:
241                                    childobj.fromXML(frag)
242                                #set this object to be an attribute of the 'parent' (self) object
243                                if hasattr(self, child):
244                                    if type(self.__dict__[child]) is not list:
245                                        tmp=self.__dict__[child]
246                                        setattr(self, child, [tmp]) #convert to list
247                                    self.__dict__[child].append(childobj)
248                                else:
249                                    setattr(self, child, childobj)
250                else:
251                    etype=None
252                    if type(ename) is list:
253                        if frag.tag in ename:
254                            etype=self._getSubstitutionType(frag.tag)
255                    elif frag.tag==ename:
256                        etype=self.CHILDREN[child][1]
257                    if etype:
258                        childobj=eval(etype)()
259                        if len(self.CHILDREN[child])>=3:
260                            if frag[:] != []:
261                                childobj.fromXML(frag[0])
262                        else:
263                            childobj.fromXML(frag)
264                           
265                        #set this object to be an attribute of the 'parent' (self) object
266                        if hasattr(self, child):
267                            if type(self.__dict__[child]) is not list:
268                                tmp=self.__dict__[child]
269                                setattr(self, child, [tmp]) #convert to list
270                            self.__dict__[child].append(childobj)
271                        else:
272                            setattr(self, child, childobj)
273
274               
275   
276class AbstractGML(csElement):
277    def __init__(self, **kwargs):
278        a=[GML('id'), GML('name')]
279        addatts(self,a)
280        csElement.__init__(self,**kwargs)
281        children={'metaDataProperty':[GML('metaDataProperty'),'csString'],'description':[GML('description'),'csString']}
282        addchildren(self,children)
283       
284class AssociationAttributeGroup(csElement):
285    def __init__(self, **kwargs):
286        a =[XLINK('href'),XLINK('role'), XLINK('arcrole'),XLINK('title'), XLINK('show'), XLINK('actuate')] 
287        addatts(self,a)
288        csElement.__init__(self,**kwargs)
289       
290class csString(AssociationAttributeGroup, csElement):
291    def __init__(self, text=None,**kwargs):
292        #Needed so it can use xlink
293        AssociationAttributeGroup.__init__(self,**kwargs)
294        if text != None:
295            if type(text) is not str:
296                text=str(text)
297            self.CONTENT=text
298        children={}
299        addchildren(self,children)
300        csElement.__init__(self,**kwargs)
301       
302class SRSReferenceGroup(csElement):
303    def __init__(self, **kwargs):
304        a =['srsName','srsDimension'] 
305        addatts(self,a)
306        csElement.__init__(self,**kwargs)
307               
308class SRSInformationGroup(csElement):
309    def __init__(self, **kwargs):
310        a =['uomLabels','axisLabels'] 
311        addatts(self,a)
312        csElement.__init__(self,**kwargs)
313       
314class ArrayDescriptor(AbstractGML, csElement):
315    def __init__(self,**kwargs):
316        AbstractGML.__init__(self,**kwargs)
317        children={'arraySize':[CSML('arraySize'), 'csString'], 'uom':[CSML('uom'),'csString'], 'numericType':[CSML('numericType'),'csString'], 'regExpTransform':[CSML('regExpTransform'),'csString'], 'numericTransform':[CSML('numericTransform'),'csString']}
318        addchildren(self,children)
319        csElement.__init__(self,**kwargs)
320       
321class DirectPosition(AbstractGML, SRSReferenceGroup,SRSInformationGroup,csElement):
322    def __init__(self, **kwargs):
323        AbstractGML.__init__(self,**kwargs)
324        csElement.__init__(self,**kwargs)
325       
326class GridEnvelope(AbstractGML,SRSReferenceGroup, csElement):
327    def __init__(self, **kwargs):
328        SRSReferenceGroup.__init__(self,**kwargs)
329        AbstractGML.__init__(self,**kwargs)
330        children={'low':[GML('low'), 'csString'],'high':[GML('high'), 'csString']}
331        addchildren(self,children)
332        csElement.__init__(self,**kwargs)
333       
334class Envelope(AbstractGML,SRSReferenceGroup, csElement):
335    def __init__(self, **kwargs):
336        SRSReferenceGroup.__init__(self,**kwargs)
337        AbstractGML.__init__(self,**kwargs)
338        children={'lowerCorner':[GML('lowerCorner'), 'DirectPosition'],'upperCorner':[GML('upperCorner'), 'DirectPosition']}
339        addchildren(self,children)
340        csElement.__init__(self,**kwargs)
341       
342
343class AbstractFeature(AbstractGML,csElement):
344    def __init__(self, **kwargs):
345        AbstractGML.__init__(self,**kwargs)
346        children={'boundedBy':[GML('boundedBy'), 'Envelope']}
347        addchildren(self,children)
348        csElement.__init__(self,**kwargs)
349       
350class AbstractFeatureCollection(AbstractFeature,csElement):
351    def __init__(self, **kwargs):
352        AbstractFeature.__init__(self,**kwargs)
353        csElement.__init__(self,**kwargs)
354       
355class DomainSet(AbstractGML,AssociationAttributeGroup,csElement):
356    def __init__(self, **kwargs):
357        AbstractGML.__init__(self,**kwargs)
358        addchildren(self,{})
359        csElement.__init__(self,**kwargs)
360       
361class AggregatedArray(ArrayDescriptor,csElement):
362    def __init__(self, **kwargs):
363        ArrayDescriptor.__init__(self,**kwargs)
364        children={'aggType':[CSML('aggType'),'csString'], 'aggIndex':[CSML('aggIndex'),'csString'],'components':[FILEFORMATS, 'ArrayDescriptor',CSML('component')]}
365        addchildren(self,children)
366        csElement.__init__(self,**kwargs)
367#'component':[CSML:('component'), 'ArrayDescriptor', CSML('component')],
368class MeasureOrNullList(AbstractGML,csElement):
369    def __init__(self, **kwargs):
370        AbstractGML.__init__(self,**kwargs)
371        children={}
372        addchildren(self,children)
373        a =['uom'] 
374        addatts(self,a)
375        csElement.__init__(self,**kwargs)
376       
377class CompositeValue(AbstractGML,csElement):
378    def __init__(self, **kwargs):
379        AbstractGML.__init__(self,**kwargs)
380        children={'measures':[GML('measure'),'csString',GML('valueComponents')]}
381        addchildren(self,children)
382        csElement.__init__(self,**kwargs)
383       
384class DataBlock(AbstractGML,csElement):
385    #THIS IS INCOMPLETE
386    def __init__(self, **kwargs):
387        AbstractGML.__init__(self,**kwargs)
388        children={'doubleOrNullTupleList':[GML('doubleOrNullTupleList'),'csString'],'rangeParameters':[GML('CompositeValue'), 'CompositeValue', GML('rangeParameters')]}
389        addchildren(self,children)
390        csElement.__init__(self,**kwargs)
391
392class ValueComponent(AbstractGML, AssociationAttributeGroup, csElement):
393    def __init__(self, **kwargs):
394        AbstractGML.__init__(self,**kwargs)
395        AssociationAttributeGroup.__init__(self,**kwargs)
396        children=children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList']}
397        addchildren(self,children)
398        csElement.__init__(self,**kwargs)
399
400class ValueArray(AbstractGML, csElement):
401    def __init__(self, **kwargs):
402        AbstractGML.__init__(self,**kwargs)
403        #this is a bit of a diversion from the object/property pattern but is necessary to
404        #make valueComponent a class so valueComponent can have xlink attributes
405        children=children={'valueComponent':[GML('valueComponent'), 'ValueComponent', ]}
406        addchildren(self,children)
407        csElement.__init__(self,**kwargs)
408       
409
410class RangeSet(AbstractGML,AssociationAttributeGroup,csElement):
411    def __init__(self, **kwargs):
412        AbstractGML.__init__(self,**kwargs)
413        AssociationAttributeGroup.__init__(self,**kwargs)
414        children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList'],        'dataBlock':[GML('DataBlock'),'DataBlock'],'arrayDescriptor':[FILEFORMATS, 'ArrayDescriptor'],  'aggregatedArray':[CSML('AggregatedArray'), 'AggregatedArray'],
415        'valueArray':[GML('ValueArray'),'ValueArray']}
416        addchildren(self,children)
417        csElement.__init__(self,**kwargs)
418       
419class MultiPoint(AbstractGML, SRSReferenceGroup,csElement):
420    def __init__(self, **kwargs):
421        AbstractGML.__init__(self,**kwargs)
422        SRSReferenceGroup.__init__(self,**kwargs)
423        children={'pointMember':[GML('pointMember'), 'csString'],'pointMembers':[GML('pointMember'), 'csString']}
424        addchildren(self,children)
425        csElement.__init__(self,**kwargs)
426       
427class Point(AbstractGML,SRSReferenceGroup,csElement):
428    def __init__(self, **kwargs):
429        AbstractGML.__init__(self,**kwargs)
430        SRSReferenceGroup.__init__(self,**kwargs)
431        children={'pos':[GML('pos'), 'csString'],'coordinates':[GML('coordinates'), 'csString']}
432        addchildren(self,children)
433        csElement.__init__(self,**kwargs)
434       
435class PointDomain(DomainSet, MultiPoint,csElement):
436    def __init__(self, **kwargs):
437        DomainSet.__init__(self,**kwargs)
438        MultiPoint.__init__(self,**kwargs)
439        children={}
440        addchildren(self,children)
441        csElement.__init__(self,**kwargs)
442       
443class ProfileDomain(DomainSet, MultiPoint,csElement):
444    def __init__(self, **kwargs):
445        DomainSet.__init__(self,**kwargs)
446        MultiPoint.__init__(self,**kwargs)
447        children={}
448        addchildren(self,children)
449        csElement.__init__(self,**kwargs)
450
451
452class AbstractCoverage(AbstractFeature, csElement):
453    def __init__(self, **kwargs):
454        AbstractFeature.__init__(self,**kwargs)
455        csElement.__init__(self,**kwargs)
456       
457class AbstractDiscreteCoverage(AbstractCoverage, csElement):
458    def __init__(self, **kwargs):
459        AbstractCoverage.__init__(self,**kwargs)
460        addchildren(self,{})
461        csElement.__init__(self,**kwargs)
462       
463class Definition(AbstractGML):
464    def __init__(self, **kwargs):
465        AbstractGML.__init__(self,**kwargs)
466        addchildren(self,{})
467        csElement.__init__(self,**kwargs)
468       
469class Phenomenon(Definition,AssociationAttributeGroup):
470    def __init__(self, **kwargs):
471        Definition.__init__(self,**kwargs)
472        AssociationAttributeGroup.__init__(self,**kwargs)
473        children = {'':[CSML(''), '']}   
474        addchildren(self,children)
475        csElement.__init__(self,**kwargs)
476               
477class SpatialOrTemporalPositionList(AbstractGML,csElement):
478    def __init__(self, **kwargs):
479        AbstractGML.__init__(self,**kwargs)
480        children={'coordinateList':[CSML('coordinateList'),'csString'], 'timePositionList':[CSML('timePositionList'),'TimePositionList']}
481        addchildren(self,children)
482        a=['frame']
483        addatts(self,a)
484        csElement.__init__(self,**kwargs)
485
486class GridOrdinateDescription(AbstractGML,csElement):
487    def __init__(self, **kwargs):
488        AbstractGML.__init__(self,**kwargs)
489        children={'coordAxisLabel':[CSML('coordAxisLabel'), 'csString'], 'coordAxisValues':[CSML('SpatialOrTemporalPositionList'),'SpatialOrTemporalPositionList',CSML('coordAxisValues')], 'gridAxesSpanned':[CSML('gridAxesSpanned'), 'csString'], 'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
490        addchildren(self,children)
491        csElement.__init__(self,**kwargs)
492       
493class SequenceRule(csElement):
494    def __init__(self, **kwargs):
495        a=['axisOrder']
496        addatts(self,a)
497        children={}
498        addchildren(self,children)
499        csElement.__init__(self,**kwargs)
500       
501class GridPointDescription(AbstractGML,csElement):
502    def __init__(self, **kwargs):
503        AbstractGML.__init__(self,**kwargs)
504        children={'posList':[CSML('posList'),'csString'],'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
505        addchildren(self,children)
506        csElement.__init__(self,**kwargs)
507
508class TimePositionList(AbstractGML,csElement):
509    def __init__(self,**kwargs):
510        a=['frame', 'calendarEraName','indeterminatePosition']
511        addatts(self,a)
512        addchildren(self,{})
513        csElement.__init__(self,**kwargs)
514
515class GridCoordinatesTable(AbstractGML,csElement):
516    def __init__(self,**kwargs):
517        '''the additional value '1' in the children dictionary is used to signify that the elements must be nested as:
518        <gml:ordinate>
519            <gml:GridOrdinateDescription>
520        </gml:ordinate>
521        <gml:ordinate>
522            <gml:GridOrdinateDescription>
523        </gml:ordinate>
524       
525        not as:
526        <gml:ordinate>
527            <gml:GridOrdinateDescription>
528            <gml:GridOrdinateDescription>
529        </gml:ordinate> '''
530        AbstractGML.__init__(self,**kwargs)
531        children={'gridOrdinates':[CSML('GridOrdinateDescription'), 'GridOrdinateDescription',CSML('gridOrdinate'),1], 'gridPoints':[CSML('GridPointDescription'),'GridPointDescription',CSML('gridPoints')]}
532        addchildren(self,children)
533        csElement.__init__(self,**kwargs)
534       
535class ReferenceableGrid(AbstractGML, AssociationAttributeGroup, SRSInformationGroup, SRSReferenceGroup,csElement):
536    def __init__(self, **kwargs):
537        AbstractGML.__init__(self,**kwargs)
538        AssociationAttributeGroup.__init__(self,**kwargs)
539        SRSReferenceGroup.__init__(self,**kwargs)
540        SRSInformationGroup.__init__(self,**kwargs)
541        children={'coordTransformTable':[CSML('GridCoordinatesTable'), 'GridCoordinatesTable', CSML('coordTransformTable')],'aLabels':[CSML('axisLabels'),'csString'], 'limits':[GML('GridEnvelope'),'GridEnvelope',CSML('limits')]}
542        addchildren(self,children)
543        csElement.__init__(self,**kwargs)
544
545class ReferenceableGridCoverage(AbstractDiscreteCoverage, csElement):
546    def __init__(self, **kwargs):
547        AbstractDiscreteCoverage.__init__(self,**kwargs)
548        children={'referenceableGridDomain':[CSML('ReferenceableGrid'),'ReferenceableGrid' ,CSML('referenceableGridDomain') ]}
549        addchildren(self,children)
550        csElement.__init__(self,**kwargs)
551       
552class AlternatePointCoverage(AbstractDiscreteCoverage, csElement):
553    def __init__(self, **kwargs):
554        AbstractDiscreteCoverage.__init__(self,**kwargs)
555        children={'alternatePointDomain':[GML('Point'),'Point', CSML('alternatePointDomain')], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
556        addchildren(self,children)
557        csElement.__init__(self,**kwargs)
558
559class ProfileCoverage(AbstractDiscreteCoverage, csElement):
560    def __init__(self, **kwargs):
561        AbstractDiscreteCoverage.__init__(self,**kwargs)
562        children={'profileDomain':[CSML('ProfileDomain'),'ProfileDomain' ,CSML('profileDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
563        addchildren(self,children)
564        csElement.__init__(self,**kwargs)
565       
566class PointCoverage(AbstractDiscreteCoverage, csElement):
567    def __init__(self, **kwargs):
568        AbstractDiscreteCoverage.__init__(self,**kwargs)
569        children={'pointDomain':[CSML('PointDomain'),'PointDomain' ,CSML('pointDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
570        addchildren(self,children)
571        csElement.__init__(self,**kwargs)
572       
573class TimeSeriesDomain(AbstractGML, csElement):
574    def __init__(self, **kwargs):
575        AbstractGML.__init__(self,**kwargs)
576        children={'time':[CSML('time'), 'csString']}
577        addchildren(self,children)
578        csElement.__init__(self,**kwargs)
579
580class PointSeriesCoverage(AbstractDiscreteCoverage, csElement):
581    def __init__(self, **kwargs):
582        AbstractDiscreteCoverage.__init__(self,**kwargs)
583        children={'pointSeriesDomain':[CSML('TimeSeriesDomain'),'TimeSeriesDomain' ,CSML('pointSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
584        addchildren(self,children)
585        csElement.__init__(self,**kwargs)
586       
587class ProfileSeriesDomain(ReferenceableGrid, DomainSet, csElement):
588    def __init__(self, **kwargs):
589        DomainSet.__init__(self,**kwargs)
590        ReferenceableGrid.__init__(self,**kwargs)
591        children={}
592        addchildren(self,children)
593        csElement.__init__(self,**kwargs)
594       
595class ProfileSeriesCoverage(AbstractDiscreteCoverage,csElement):
596    def __init__(self, **kwargs):
597        AbstractDiscreteCoverage.__init__(self,**kwargs)
598        children={'profileSeriesDomain':[CSML('ProfileSeriesDomain'),'ProfileSeriesDomain' ,CSML('profileSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
599        addchildren(self,children)
600        csElement.__init__(self,**kwargs)
601       
602class SectionDomain(ReferenceableGrid, DomainSet, csElement):
603    def __init__(self, **kwargs):
604        DomainSet.__init__(self,**kwargs)
605        ReferenceableGrid.__init__(self,**kwargs)
606        children={}
607        addchildren(self,children)
608        csElement.__init__(self,**kwargs)
609       
610class SectionCoverage(AbstractDiscreteCoverage,csElement):
611    def __init__(self, **kwargs):
612        AbstractDiscreteCoverage.__init__(self,**kwargs)
613        children={'sectionDomain':[CSML('SectionDomain'),'SectionDomain' ,CSML('sectionDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
614        addchildren(self,children)
615        csElement.__init__(self,**kwargs)
616       
617class TrajectoryDomain(ReferenceableGrid, DomainSet, csElement):
618    def __init__(self, **kwargs):
619        DomainSet.__init__(self,**kwargs)
620        ReferenceableGrid.__init__(self,**kwargs)
621        children={}
622        addchildren(self,children)
623        csElement.__init__(self,**kwargs)
624       
625class TrajectoryCoverage(AbstractDiscreteCoverage,csElement):
626    def __init__(self, **kwargs):
627        AbstractDiscreteCoverage.__init__(self,**kwargs)
628        children={'trajectoryDomain':[CSML('TrajectoryDomain'),'TrajectoryDomain' ,CSML('trajectoryDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
629        addchildren(self,children)
630        csElement.__init__(self,**kwargs)
631
632class ScanningRadarDomain(ReferenceableGrid, DomainSet, csElement):
633    def __init__(self, **kwargs):
634        DomainSet.__init__(self,**kwargs)
635        ReferenceableGrid.__init__(self,**kwargs)
636        children={}
637        addchildren(self,children)
638        csElement.__init__(self,**kwargs)
639       
640class ScanningRadarCoverage(AbstractDiscreteCoverage,csElement):
641    def __init__(self, **kwargs):
642        AbstractDiscreteCoverage.__init__(self,**kwargs)
643        children={'scanningRadarDomain':[CSML('ScanningRadarDomain'),'ScanningRadarDomain' ,CSML('scanningRadarDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
644        addchildren(self,children)
645        csElement.__init__(self,**kwargs)
646
647
648class GridSeriesDomain(ReferenceableGrid, csElement):
649    def __init__(self, **kwargs):
650        #DomainSet.__init__(self,**kwargs)
651        ReferenceableGrid.__init__(self,**kwargs)
652        children={}
653        addchildren(self,children)
654        csElement.__init__(self,**kwargs)
655
656class GridSeriesCoverage(AbstractDiscreteCoverage,csElement):
657    def __init__(self, **kwargs):
658        AbstractDiscreteCoverage.__init__(self,**kwargs)
659        children={'gridSeriesDomain':[CSML('GridSeriesDomain'),'GridSeriesDomain' ,CSML('gridSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
660        addchildren(self,children)
661        csElement.__init__(self,**kwargs)
662
663class AlternatePointFeature(AbstractFeature, csElement):
664    def __init__(self, **kwargs):
665        AbstractFeature.__init__(self,**kwargs)
666        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('AlternatePointCoverage'), 'AlternatePointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
667        addchildren(self,children)
668        csElement.__init__(self,**kwargs)
669
670class PointFeature(AbstractFeature, csElement):
671    def __init__(self, **kwargs):
672        AbstractFeature.__init__(self,**kwargs)
673        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('PointCoverage'), 'PointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
674        addchildren(self,children)
675        csElement.__init__(self,**kwargs)
676
677class PointCollectionFeature(AbstractFeature, csElement):
678    def __init__(self, **kwargs):
679        AbstractFeature.__init__(self,**kwargs)
680        children={'time':[CSML('time'), 'csString'], 'value':[CSML('MultiPointCoverage'), 'MultiPointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
681        addchildren(self,children)
682        csElement.__init__(self,**kwargs)
683
684
685class PointSeriesFeature(AbstractFeature, csElement):
686    def __init__(self, **kwargs):
687        AbstractFeature.__init__(self,**kwargs)
688        children={'location':[CSML('location'), 'csString'], 'value':[CSML('PointSeriesCoverage'), 'PointSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
689        addchildren(self,children)
690        csElement.__init__(self,**kwargs)
691
692
693class GridFeature(AbstractFeature, csElement):
694    def __init__(self, **kwargs):
695        AbstractFeature.__init__(self,**kwargs)
696        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
697        addchildren(self,children)
698        csElement.__init__(self,**kwargs)
699
700class GridSeriesFeature(AbstractFeature, csElement):
701    def __init__(self, **kwargs):
702        AbstractFeature.__init__(self,**kwargs)
703        children={'value':[CSML('GridSeriesCoverage'), 'GridSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
704        addchildren(self,children)
705        csElement.__init__(self,**kwargs)
706
707class ProfileFeature(AbstractFeature, csElement):
708    def __init__(self, **kwargs):
709        AbstractFeature.__init__(self,**kwargs)
710        children={'time':[CSML('time'), 'csString'],'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileCoverage'), 'ProfileCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
711        addchildren(self,children)
712        csElement.__init__(self,**kwargs)
713
714class ProfileSeriesFeature(AbstractFeature, csElement):
715    def __init__(self, **kwargs):
716        AbstractFeature.__init__(self,**kwargs)
717        children={'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
718        addchildren(self,children)
719        csElement.__init__(self,**kwargs)
720
721class RaggedProfileSeriesFeature(AbstractFeature, csElement):
722    def __init__(self, **kwargs):
723        AbstractFeature.__init__(self,**kwargs)
724        children={'location':[CSML('location'), 'csString'], 'profileLength':[CSML('profileLength'), 'csString'],'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
725        addchildren(self,children)
726        csElement.__init__(self,**kwargs)
727
728class RaggedSectionFeature(AbstractFeature, csElement):
729    def __init__(self, **kwargs):
730        AbstractFeature.__init__(self,**kwargs)
731        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'profileLength':[CSML('profileLength'),'csString'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
732        addchildren(self,children)
733        csElement.__init__(self,**kwargs)
734
735class SectionFeature(AbstractFeature, csElement):
736    def __init__(self, **kwargs):
737        AbstractFeature.__init__(self,**kwargs)
738        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'TimePositionList'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
739        addchildren(self,children)
740        csElement.__init__(self,**kwargs)
741
742class ScanningRadarFeature(AbstractFeature, csElement):
743    def __init__(self, **kwargs):
744        AbstractFeature.__init__(self,**kwargs)
745        children={'elevation':[CSML('elevation'), 'csString'], 'value':[CSML('ScanningRadarCoverage'), 'ScanningRadarCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
746        addchildren(self,children)
747        csElement.__init__(self,**kwargs)
748
749       
750class SwathFeature(AbstractFeature, csElement):
751    def __init__(self, **kwargs):
752        AbstractFeature.__init__(self,**kwargs)
753        children={'eqCrossLon':[CSML('eqCrossLon'), 'csString'],'eqCrossTime':[CSML('eqCrossTime'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
754        addchildren(self,children)
755        csElement.__init__(self,**kwargs)
756       
757class TrajectoryFeature(AbstractFeature, csElement):
758    def __init__(self, **kwargs):
759        AbstractFeature.__init__(self,**kwargs)
760        children={'value':[CSML('TrajectoryCoverage'), 'TrajectoryCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
761        addchildren(self,children)
762        csElement.__init__(self,**kwargs)
763       
764class FileList(AssociationAttributeGroup,AbstractGML,csElement):
765    def __init__(self,**kwargs):
766        AssociationAttributeGroup.__init__(self,**kwargs)
767        AbstractGML.__init__(self,**kwargs)
768        addatts(self,[])
769        children= {'fileNames':[CSML('fileNames'), 'csString']}
770        addchildren(self,children)
771        csElement.__init__(self,**kwargs)
772       
773class FileExtract(ArrayDescriptor, csElement):
774    def __init__(self,**kwargs):
775        ArrayDescriptor.__init__(self,**kwargs)
776        children= {'fileName':[CSML('fileName'), 'csString'],  'fileList':[CSML('FileList'), 'FileList', CSML('fileList')],'fileListXLINK':[CSML('fileList'), 'csString']}
777        addchildren(self,children)
778        csElement.__init__(self,**kwargs)
779
780class NetCDFExtract(FileExtract, csElement):
781    def __init__(self,**kwargs):
782        FileExtract.__init__(self, **kwargs)
783        children={'variableName':[CSML('variableName'), 'csString']}
784        addchildren(self,children)
785        csElement.__init__(self,**kwargs)
786
787class NASAAmesExtract(FileExtract, csElement):
788    def __init__(self,**kwargs):
789        FileExtract.__init__(self, **kwargs)
790        children={'variableName':[CSML('variableName'), 'csString'], 'index':[CSML('index'),'csString']}
791        addchildren(self,children)
792        csElement.__init__(self,**kwargs)
793
794class CSMLStorageDescriptor(csElement):
795    def __init__(self,**kwargs):
796        addatts(self,[])
797        children={'descriptors':[[CSML('NetCDFExtract'),CSML('PointFeature'),CSML('AggregatedArray')], 'FileExtract', CSML('descriptor'),1]}
798        addchildren(self,children)
799        csElement.__init__(self,**kwargs)
800
801class CSMLFeatureCollection(AbstractFeatureCollection,csElement,):
802    def __init__(self,**kwargs):
803        AbstractFeatureCollection.__init__(self,**kwargs)
804        children={'featureMembers':[[CSML('GridFeature'), CSML('GridSeriesFeature'),CSML('PointFeature'),CSML('TrajectoryFeature'),CSML('ProfileFeature'),CSML('ProfileSeriesFeature'),CSML('RaggedProfileSeriesFeature'),CSML('RaggedSectionFeature'),CSML('SectionFeature'),CSML('ScanningRadarFeature'),CSML('PointSeriesFeature'),CSML('AlternatePointFeature')], 'AbstractFeature', GML('featureMember'),1]}
805        addchildren(self,children)
806        csElement.__init__(self,**kwargs)
807    def _getSubstitutionType(self,tag):
808        if tag==CSML('GridFeature'):
809            return 'GridFeature'
810        elif tag==CSML('GridSeriesFeature'):
811            return 'GridSeriesFeature'
812        elif tag==CSML('PointFeature'):
813            return 'PointFeature'
814        elif tag==CSML('TrajectoryFeature'):
815            return 'TrajectoryFeature'
816        elif tag==CSML('PointSeriesFeature'):
817            return 'PointSeriesFeature'
818        elif tag==CSML('ProfileFeature'):
819            return 'ProfileFeature'
820        elif tag==CSML('ProfileSeriesFeature'):
821            return 'ProfileSeriesFeature'
822        elif tag==CSML('RaggedProfileSeriesFeature'):
823            return 'RaggedProfileSeriesFeature'
824        elif tag==CSML('RaggedSectionFeature'):
825            return 'RaggedSectionFeature'
826        elif tag==CSML('SectionFeature'):
827            return 'SectionFeature'
828        elif tag==CSML('ScanningRadarFeature'):
829            return 'ScanningRadarFeature'
830        elif tag==CSML('AlternatePointFeature'):
831            return 'AlternatePointFeature'
832        else: return 'AbstractFeature'
833    def _getReverseSubsType(self, typename):
834        if typename== 'GridFeature':
835            return CSML('GridFeature')
836        elif typename == 'GridSeriesFeature':
837            return CSML('GridSeriesFeature')
838        elif typename == 'PointSeriesFeature':
839            return CSML('PointSeriesFeature')
840        elif typename == 'ProfileFeature':
841            return CSML('ProfileFeature')
842        elif typename == 'ProfileSeriesFeature':
843            return CSML('ProfileSeriesFeature')
844        elif typename == 'SectionFeature':
845            return CSML('SectionFeature')
846        elif typename == 'ScanningRadarFeature':
847            return CSML('ScanningRadarFeature')
848        elif typename == 'RaggedSectionFeature':
849            return CSML('RaggedSectionFeature')
850        elif typename == 'RaggedProfileSeriesFeature':
851            return CSML('RaggedProfileSeriesFeature')
852        elif typename == 'PointFeature':
853            return CSML('PointFeature')
854        elif typename == 'TrajectoryFeature':
855            return CSML('TrajectoryFeature')
856        elif typename == 'AlternatePointFeature':
857            return CSML('AlternatePointFeature')
858        else: return CSML('AbstractFeature')
859
860       
861class Dataset(AbstractGML, csElement):   
862    ''' Dataset class, needed as root of tree'''
863    def __init__(self, **kwargs):
864        AbstractGML.__init__(self,**kwargs)
865        children = {'featureCollection':[CSML('CSMLFeatureCollection') ,'CSMLFeatureCollection'],'storageDescriptor':[CSML('CSMLStorageDescriptor'), 'CSMLStorageDescriptor']}
866        addchildren(self,children)
867        csElement.__init__(self,**kwargs)
868   
869    def toXML(self):
870        csmlfrag=ET.Element(CSML('Dataset'))
871        csElement.toXML(self, csmlfrag)
872        return csmlfrag
873    #def _getSubstitutionType(self,tag): 
874        #if tag==CSML('NetCDFExtract'):
875            #return 'NetCDFExtract'
876        #elif tag==CSML('NASAAmesExtract'):
877            #return 'NASAAmesExtract'
878        #else: return 'ArrayDescriptor'
879    #def _getReverseSubsType(self, typename):
880        #if typename== 'NetCDFExtract':
881            #return CSML('NetCDFExtract')
882        #elif typename == 'NASAAmesExtract':
883            #return CSML('NASAAmesExtract')
884        #else: return CSML('ArrayDescriptor')
885       
886        return typename
887
888   
889def main():
890    '''round trip for testing purposes:'''
891    print '\n'
892    tree=ET.ElementTree(file='test.xml')
893    ds=Dataset()
894    ds.fromXML(tree.getroot())
895    csmltree=ds.toXML()
896    #print csmltree
897   
898    csmlout=parser_extra.PrettyPrint(csmltree)
899    csmlout=parser_extra.removeInlineNS(csmlout)
900    print '\n %s'% csmlout
901    #for member in ds.featureCollection.members:
902      #print dir(member.value)
903       
904
905if __name__=='__main__':
906    main()
Note: See TracBrowser for help on using the repository browser.