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

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

online v2 parser code working

Line 
1import cElementTree as ET
2import elementtree.ElementTree as etree
3import sys, traceback
4'''CSML v2 Parser ''' 
5
6#this map needs updating for V2
7etree._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'})
8
9nsCSML = 'http://ndg.nerc.ac.uk/csml'
10nsGML = 'http://www.opengis.net/gml'
11nsOM = 'http://www.opengis.net/om'
12nsXLINK = 'http://www.w3.org/1999/xlink'
13nsXML = 'http://ndg.nerc.ac.uk/csml'
14nsMOLES='http://ndg.nerc.ac.uk/moles'
15nsSWE='http://www.opengis.net/swe'
16   
17def myQName(uri,tag):
18    return "{"+uri+"}"+tag
19
20def CSML(tag):
21    return myQName(nsCSML,tag)
22
23def GML(tag):
24    return myQName(nsGML,tag)
25
26def SWE(tag):
27    return myQName(nsSWE,tag)
28
29def XLINK(tag):
30    return myQName(nsXLINK,tag)
31
32def addchildren(obj, dict):
33    ''' merges (adds) dictionary to existing self.CHILDREN dictionary '''
34    dict1 = dict
35    if hasattr(obj, 'CHILDREN'):
36      dict2=obj.CHILDREN
37    else:
38      dict2={}
39    dict3={}
40    for item in dict1:
41        dict3[item] =dict1[item]
42    for item in dict2:
43        dict3[item] =dict2[item]
44    obj.CHILDREN=dict3
45   
46
47def addatts(obj, atts):
48  ''' merges self.ATTRIBUTES'''
49  if hasattr(obj, 'ATTRIBUTES'):
50    for att in atts:
51        obj.ATTRIBUTES.append(att)
52  else:
53    obj.ATTRIBUTES=atts
54
55
56#Some variable definitions: these things are often repeated so store in variables.
57FILEFORMATS=[CSML('NetCDFExtract'),CSML('NASAAmesExtract'), CSML('GRIBExtract'),CSML('CDMLExtract'), CSML('RawFileExtract'), CSML('AggregatedArray')]
58
59
60class csElement(object):
61    ''' main csElement class - all other elements inherit from this baseclass 
62    all the from/to XML conversion is done by this class'''
63   
64    def __init__(self, **kwargs):
65        for kw in kwargs:
66            self.__setattr__(kw, kwargs[kw])
67        if not hasattr(self, 'ATTRIBUTES'):
68            self.__dict__['ATTRIBUTES']=[]
69               
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                    appendLater=False
164                    if child == att:
165                        parserobjects=[]
166                        if type(self.__dict__[att]) is list:
167                            for a in self.__dict__[att]:
168                                parserobjects.append(a)
169                        else:
170                            parserobjects.append(self.__dict__[att])
171                        parentfrag=None
172                        if len(self.CHILDREN[child])>=3:
173                                ename2=self.CHILDREN[child][2]
174                                parentfrag=ET.Element(ename2)
175                        for po in parserobjects:
176                            if type(self.CHILDREN[child][0]) is not list:
177                                ename=self.CHILDREN[child][0]
178                            else:
179                                ename = self._getReverseSubsType(type(po).__name__)
180                            if len(self.CHILDREN[child])==3:
181                                frag=ET.Element(ename)
182                                po.toXML(frag)
183                                parentfrag.append(frag)
184                                appendLater=True
185                            elif len(self.CHILDREN[child])>=4:
186                                if self.CHILDREN[child][3]==1:
187                                    frag=ET.Element(ename)
188                                    po.toXML(frag)
189                                    parentfrag.append(frag)
190                                    csmlfrag.append(parentfrag)
191                                    parentfrag=ET.Element(parentfrag.tag)
192                                    appendLater=False
193                            else:
194                                frag=ET.Element(ename)
195                                try:
196                                    po.toXML(frag)
197                                except:
198                                    print 'PARSING ERROR - could not convert %s to XML'%frag
199                                    print dir(ename)
200                                    raise
201                                csmlfrag.append(frag)
202                                appendLater=True
203                        if appendLater==True and parentfrag != None:
204                            csmlfrag.append(parentfrag)
205        return csmlfrag
206       
207    def fromXML(self,csmlfrag):
208        # deal with attributes, e.g. gml id's
209        if csmlfrag.text is not None:
210                self.CONTENT = csmlfrag.text
211        for item in csmlfrag.items():
212            if item[0] in self.ATTRIBUTES:
213                setattr(self, item[0], item[1])
214        #self.CHILDREN (recursive - calls the fromXML method of children
215        for frag in csmlfrag[:]:
216            #for each child element
217            #iterate through expected CHILDREN
218            for child in self.CHILDREN:
219                #get element name
220                if len(self.CHILDREN[child])>=3:
221                    ename = self.CHILDREN[child][2]
222                    ename2 = self.CHILDREN[child][0]
223                   
224                else:
225                    ename = self.CHILDREN[child][0] 
226                    ename2=None
227                #if there are options, then find the name that matches the frag
228                if ename2 is not None:
229                    if frag[:] != []:
230                        for subfrag in frag[:]:
231                            etype=None
232                            if type(ename2) is list:
233                                if subfrag.tag in ename2:
234                                    etype=self._getSubstitutionType(subfrag.tag)
235                            if subfrag.tag==ename2:
236                                etype=self.CHILDREN[child][1]
237                            if etype:
238                                childobj=eval(etype)()
239                                if len(self.CHILDREN[child])>=3:
240                                    if frag[:] != []:
241                                        childobj.fromXML(subfrag)
242                                else:
243                                    childobj.fromXML(frag)
244                                #set this object to be an attribute of the 'parent' (self) object
245                                if hasattr(self, child):
246                                    if type(self.__dict__[child]) is not list:
247                                        tmp=self.__dict__[child]
248                                        setattr(self, child, [tmp]) #convert to list
249                                    self.__dict__[child].append(childobj)
250                                else:
251                                    setattr(self, child, childobj)
252                else:
253                    etype=None
254                    if type(ename) is list:
255                        if frag.tag in ename:
256                            etype=self._getSubstitutionType(frag.tag)
257                    elif frag.tag==ename:
258                        etype=self.CHILDREN[child][1]
259                    if etype:
260                        childobj=eval(etype)()
261                        if len(self.CHILDREN[child])>=3:
262                            if frag[:] != []:
263                                childobj.fromXML(frag[0])
264                        else:
265                            childobj.fromXML(frag)
266                           
267                        #set this object to be an attribute of the 'parent' (self) object
268                        if hasattr(self, child):
269                            if type(self.__dict__[child]) is not list:
270                                tmp=self.__dict__[child]
271                                setattr(self, child, [tmp]) #convert to list
272                            self.__dict__[child].append(childobj)
273                        else:
274                            setattr(self, child, childobj)
275
276               
277   
278class AbstractGML(csElement):
279    def __init__(self, **kwargs):
280        a=[GML('id'), GML('name')]
281        addatts(self,a)
282        csElement.__init__(self,**kwargs)
283        children={'metaDataProperty':[GML('metaDataProperty'),'csString'],'description':[GML('description'),'csString']}
284        addchildren(self,children)
285       
286class AssociationAttributeGroup(csElement):
287    def __init__(self, **kwargs):
288        a =[XLINK('href'),XLINK('role'), XLINK('arcrole'),XLINK('title'), XLINK('show'), XLINK('actuate')] 
289        addatts(self,a)
290        csElement.__init__(self,**kwargs)
291       
292class csString(AssociationAttributeGroup, csElement):
293    def __init__(self, text=None,**kwargs):
294        #Needed so it can use xlink
295        AssociationAttributeGroup.__init__(self,**kwargs)
296        if text != None:
297            if type(text) is not str:
298                text=str(text)
299            self.CONTENT=text
300        children={}
301        addchildren(self,children)
302        csElement.__init__(self,**kwargs)
303       
304class SRSReferenceGroup(csElement):
305    def __init__(self, **kwargs):
306        a =['srsName','srsDimension'] 
307        addatts(self,a)
308        csElement.__init__(self,**kwargs)
309               
310class SRSInformationGroup(csElement):
311    def __init__(self, **kwargs):
312        a =['uomLabels','axisLabels'] 
313        addatts(self,a)
314        csElement.__init__(self,**kwargs)
315       
316class ArrayDescriptor(AbstractGML, csElement):
317    def __init__(self,**kwargs):
318        AbstractGML.__init__(self,**kwargs)
319        children={'arraySize':[CSML('arraySize'), 'csString'], 'uom':[CSML('uom'),'csString'], 'numericType':[CSML('numericType'),'csString'], 'regExpTransform':[CSML('regExpTransform'),'csString'], 'numericTransform':[CSML('numericTransform'),'csString']}
320        addchildren(self,children)
321        csElement.__init__(self,**kwargs)
322               
323class GridEnvelope(AbstractGML,SRSReferenceGroup, csElement):
324    def __init__(self, **kwargs):
325        SRSReferenceGroup.__init__(self,**kwargs)
326        AbstractGML.__init__(self,**kwargs)
327        children={'low':[GML('low'), 'csString'],'high':[GML('high'), 'csString']}
328        addchildren(self,children)
329        csElement.__init__(self,**kwargs)
330       
331class Envelope(AbstractGML,SRSReferenceGroup, csElement):
332    def __init__(self, **kwargs):
333        SRSReferenceGroup.__init__(self,**kwargs)
334        AbstractGML.__init__(self,**kwargs)
335        children={'lowerCorner':[GML('lowerCorner'), 'csString'],'upperCorner':[GML('upperCorner'), 'csString']}
336        addchildren(self,children)
337        csElement.__init__(self,**kwargs)
338       
339class EnvelopeWithTimePeriod(Envelope):
340    def __init__(self, **kwargs):
341        Envelope.__init__(self,**kwargs)
342        children={'timePosition':[GML('timePosition'), 'csString']}
343        addchildren(self,children)
344        csElement.__init__(self,**kwargs)
345
346class AbstractFeature(AbstractGML,csElement):
347    def __init__(self, **kwargs):
348        AbstractGML.__init__(self,**kwargs)
349        #this pattern works but can only accept EnvelopeWithTimePeriod for the boundedBy,
350        #which is probably ok   
351        children={'boundedBy':[GML('EnvelopeWithTimePeriod'), 'EnvelopeWithTimePeriod', GML('boundedBy')]}
352        addchildren(self,children)
353        csElement.__init__(self,**kwargs)
354       
355class AbstractFeatureCollection(AbstractFeature,csElement):
356    def __init__(self, **kwargs):
357        AbstractFeature.__init__(self,**kwargs)
358        csElement.__init__(self,**kwargs)
359       
360class DomainSet(AbstractGML,AssociationAttributeGroup,csElement):
361    def __init__(self, **kwargs):
362        AbstractGML.__init__(self,**kwargs)
363        addchildren(self,{})
364        csElement.__init__(self,**kwargs)
365       
366class AggregatedArray(ArrayDescriptor,csElement):
367    def __init__(self, **kwargs):
368        ArrayDescriptor.__init__(self,**kwargs)
369        children={'aggType':[CSML('aggType'),'csString'], 'aggIndex':[CSML('aggIndex'),'csString'],'components':[FILEFORMATS, 'ArrayDescriptor',CSML('component')]}
370        addchildren(self,children)
371        csElement.__init__(self,**kwargs)
372#'component':[CSML:('component'), 'ArrayDescriptor', CSML('component')],
373class MeasureOrNullList(AbstractGML,csElement):
374    def __init__(self, **kwargs):
375        AbstractGML.__init__(self,**kwargs)
376        #note __insertedExtract is used in resolving xlinks and shouldn't be written to directly (except by the code which handles the xlink resolutions)
377        children={'__insertedExtract':[FILEFORMATS,'FileExtract',CSML('__insertedExtract')]}
378        addchildren(self,children)
379        a =['uom'] 
380        addatts(self,a)
381        csElement.__init__(self,**kwargs)
382       
383       
384class CompositeValue(AbstractGML,csElement):
385    def __init__(self, **kwargs):
386        AbstractGML.__init__(self,**kwargs)
387        children={'measures':[GML('measure'),'csString',GML('valueComponents')]}
388        addchildren(self,children)
389        csElement.__init__(self,**kwargs)
390       
391class DataBlock(AbstractGML,csElement):
392    #THIS IS INCOMPLETE
393    def __init__(self, **kwargs):
394        AbstractGML.__init__(self,**kwargs)
395        children={'doubleOrNullTupleList':[GML('doubleOrNullTupleList'),'csString'],'rangeParameters':[GML('CompositeValue'), 'CompositeValue', GML('rangeParameters')]}
396        addchildren(self,children)
397        csElement.__init__(self,**kwargs)
398
399class ValueComponent(AbstractGML, AssociationAttributeGroup, csElement):
400    def __init__(self, **kwargs):
401        AbstractGML.__init__(self,**kwargs)
402        AssociationAttributeGroup.__init__(self,**kwargs)
403        children=children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList']}
404        addchildren(self,children)
405        csElement.__init__(self,**kwargs)
406
407class ValueArray(AbstractGML, csElement):
408    def __init__(self, **kwargs):
409        AbstractGML.__init__(self,**kwargs)
410        #this is a bit of a diversion from the object/property pattern but is necessary to
411        #make valueComponent a class so valueComponent can have xlink attributes
412        children=children={'valueComponent':[GML('valueComponent'), 'ValueComponent', ]}
413        addchildren(self,children)
414        csElement.__init__(self,**kwargs)
415       
416
417class RangeSet(AbstractGML,AssociationAttributeGroup,csElement):
418    def __init__(self, **kwargs):
419        AbstractGML.__init__(self,**kwargs)
420        AssociationAttributeGroup.__init__(self,**kwargs)
421        children={'quantityList':[GML('QuantityList'), 'MeasureOrNullList'],        'dataBlock':[GML('DataBlock'),'DataBlock'],'arrayDescriptor':[FILEFORMATS, 'ArrayDescriptor'],  'aggregatedArray':[CSML('AggregatedArray'), 'AggregatedArray'],
422        'valueArray':[GML('ValueArray'),'ValueArray']}
423        addchildren(self,children)
424        csElement.__init__(self,**kwargs)
425       
426class MultiPoint(AbstractGML, SRSReferenceGroup,csElement):
427    def __init__(self, **kwargs):
428        AbstractGML.__init__(self,**kwargs)
429        SRSReferenceGroup.__init__(self,**kwargs)
430        children={'pointMember':[GML('pointMember'), 'csString'],'pointMembers':[GML('pointMember'), 'csString']}
431        addchildren(self,children)
432        csElement.__init__(self,**kwargs)
433       
434class Point(AbstractGML,SRSReferenceGroup,csElement):
435    def __init__(self, **kwargs):
436        AbstractGML.__init__(self,**kwargs)
437        SRSReferenceGroup.__init__(self,**kwargs)
438        children={'pos':[GML('pos'), 'csString'],'coordinates':[GML('coordinates'), 'csString']}
439        addchildren(self,children)
440        csElement.__init__(self,**kwargs)
441       
442class PointDomain(DomainSet, MultiPoint,csElement):
443    def __init__(self, **kwargs):
444        DomainSet.__init__(self,**kwargs)
445        MultiPoint.__init__(self,**kwargs)
446        children={}
447        addchildren(self,children)
448        csElement.__init__(self,**kwargs)
449       
450class ProfileDomain(DomainSet, MultiPoint,csElement):
451    def __init__(self, **kwargs):
452        DomainSet.__init__(self,**kwargs)
453        MultiPoint.__init__(self,**kwargs)
454        children={}
455        addchildren(self,children)
456        csElement.__init__(self,**kwargs)
457
458
459class AbstractCoverage(AbstractFeature, csElement):
460    def __init__(self, **kwargs):
461        AbstractFeature.__init__(self,**kwargs)
462        csElement.__init__(self,**kwargs)
463       
464class AbstractDiscreteCoverage(AbstractCoverage, csElement):
465    def __init__(self, **kwargs):
466        AbstractCoverage.__init__(self,**kwargs)
467        addchildren(self,{})
468        csElement.__init__(self,**kwargs)
469       
470class Definition(AbstractGML):
471    def __init__(self, **kwargs):
472        AbstractGML.__init__(self,**kwargs)
473        addchildren(self,{})
474        csElement.__init__(self,**kwargs)
475       
476class Phenomenon(Definition,AssociationAttributeGroup):
477    def __init__(self, **kwargs):
478        Definition.__init__(self,**kwargs)
479        AssociationAttributeGroup.__init__(self,**kwargs)
480        children = {'':[CSML(''), '']}   
481        addchildren(self,children)
482        csElement.__init__(self,**kwargs)
483               
484class SpatialOrTemporalPositionList(AbstractGML,csElement):
485    def __init__(self, **kwargs):
486        AbstractGML.__init__(self,**kwargs)
487        children={'coordinateList':[CSML('coordinateList'),'csString'], 'timePositionList':[CSML('timePositionList'),'TimePositionList'],'__insertedExtract':[FILEFORMATS,'FileExtract',CSML('__insertedExtract')]}
488        addchildren(self,children)
489        a=['frame']
490        addatts(self,a)
491        csElement.__init__(self,**kwargs)
492children={'descriptors':[[CSML('NetCDFExtract'),CSML('AggregatedArray')], 'FileExtract', CSML('descriptor'),1]}
493
494
495
496class GridOrdinateDescription(AbstractGML,csElement):
497    def __init__(self, **kwargs):
498        AbstractGML.__init__(self,**kwargs)
499        children={'coordAxisLabel':[CSML('coordAxisLabel'), 'csString'], 'coordAxisValues':[CSML('SpatialOrTemporalPositionList'),'SpatialOrTemporalPositionList',CSML('coordAxisValues')], 'gridAxesSpanned':[CSML('gridAxesSpanned'), 'csString'], 'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
500        addchildren(self,children)
501        csElement.__init__(self,**kwargs)
502       
503class SequenceRule(csElement):
504    def __init__(self, **kwargs):
505        a=['axisOrder']
506        addatts(self,a)
507        children={}
508        addchildren(self,children)
509        csElement.__init__(self,**kwargs)
510       
511class GridPointDescription(AbstractGML,csElement):
512    def __init__(self, **kwargs):
513        AbstractGML.__init__(self,**kwargs)
514        children={'posList':[CSML('posList'),'csString'],'sequenceRule':[CSML('sequenceRule'),'SequenceRule']}
515        addchildren(self,children)
516        csElement.__init__(self,**kwargs)
517
518class TimePositionList(AbstractGML,csElement):
519    def __init__(self,**kwargs):
520        a=['frame', 'calendarEraName','indeterminatePosition']
521        addatts(self,a)
522        addchildren(self,{})
523        csElement.__init__(self,**kwargs)
524
525class GridCoordinatesTable(AbstractGML,csElement):
526    def __init__(self,**kwargs):
527        '''the additional value '1' in the children dictionary is used to signify that the elements must be nested as:
528        <gml:ordinate>
529            <gml:GridOrdinateDescription>
530        </gml:ordinate>
531        <gml:ordinate>
532            <gml:GridOrdinateDescription>
533        </gml:ordinate>
534       
535        not as:
536        <gml:ordinate>
537            <gml:GridOrdinateDescription>
538            <gml:GridOrdinateDescription>
539        </gml:ordinate> '''
540        AbstractGML.__init__(self,**kwargs)
541        children={'gridOrdinates':[CSML('GridOrdinateDescription'), 'GridOrdinateDescription',CSML('gridOrdinate'),1], 'gridPoints':[CSML('GridPointDescription'),'GridPointDescription',CSML('gridPoints')]}
542        addchildren(self,children)
543        csElement.__init__(self,**kwargs)
544       
545class ReferenceableGrid(AbstractGML, AssociationAttributeGroup, SRSInformationGroup, SRSReferenceGroup,csElement):
546    def __init__(self, **kwargs):
547        AbstractGML.__init__(self,**kwargs)
548        AssociationAttributeGroup.__init__(self,**kwargs)
549        SRSReferenceGroup.__init__(self,**kwargs)
550        SRSInformationGroup.__init__(self,**kwargs)
551        children={'coordTransformTable':[CSML('GridCoordinatesTable'), 'GridCoordinatesTable', CSML('coordTransformTable')],'aLabels':[CSML('axisLabels'),'csString'], 'limits':[GML('GridEnvelope'),'GridEnvelope',CSML('limits')]}
552        addchildren(self,children)
553        csElement.__init__(self,**kwargs)
554
555class ReferenceableGridCoverage(AbstractDiscreteCoverage, csElement):
556    def __init__(self, **kwargs):
557        AbstractDiscreteCoverage.__init__(self,**kwargs)
558        children={'referenceableGridDomain':[CSML('ReferenceableGrid'),'ReferenceableGrid' ,CSML('referenceableGridDomain') ]}
559        addchildren(self,children)
560        csElement.__init__(self,**kwargs)
561       
562class AlternatePointCoverage(AbstractDiscreteCoverage, csElement):
563    def __init__(self, **kwargs):
564        AbstractDiscreteCoverage.__init__(self,**kwargs)
565        children={'alternatePointDomain':[GML('Point'),'Point', CSML('alternatePointDomain')], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
566        addchildren(self,children)
567        csElement.__init__(self,**kwargs)
568
569class ProfileCoverage(AbstractDiscreteCoverage, csElement):
570    def __init__(self, **kwargs):
571        AbstractDiscreteCoverage.__init__(self,**kwargs)
572        children={'profileDomain':[CSML('ProfileDomain'),'ProfileDomain' ,CSML('profileDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
573        addchildren(self,children)
574        csElement.__init__(self,**kwargs)
575       
576class PointCoverage(AbstractDiscreteCoverage, csElement):
577    def __init__(self, **kwargs):
578        AbstractDiscreteCoverage.__init__(self,**kwargs)
579        children={'pointDomain':[CSML('PointDomain'),'PointDomain' ,CSML('pointDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
580        addchildren(self,children)
581        csElement.__init__(self,**kwargs)
582       
583class TimeSeries(AbstractGML, csElement):
584    def __init__(self, **kwargs):
585        AbstractGML.__init__(self,**kwargs)
586        children={'timePositionList':[CSML('timePositionList'), 'csString']}
587        addchildren(self,children)
588        csElement.__init__(self,**kwargs)
589
590class PointSeriesCoverage(AbstractDiscreteCoverage, csElement):
591    def __init__(self, **kwargs):
592        AbstractDiscreteCoverage.__init__(self,**kwargs)
593        children={'pointSeriesDomain':[CSML('TimeSeries'),'TimeSeries' ,CSML('pointSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
594        addchildren(self,children)
595        csElement.__init__(self,**kwargs)
596       
597class ProfileSeriesDomain(ReferenceableGrid, DomainSet, csElement):
598    def __init__(self, **kwargs):
599        DomainSet.__init__(self,**kwargs)
600        ReferenceableGrid.__init__(self,**kwargs)
601        children={}
602        addchildren(self,children)
603        csElement.__init__(self,**kwargs)
604       
605class ProfileSeriesCoverage(AbstractDiscreteCoverage,csElement):
606    def __init__(self, **kwargs):
607        AbstractDiscreteCoverage.__init__(self,**kwargs)
608        children={'profileSeriesDomain':[CSML('ProfileSeriesDomain'),'ProfileSeriesDomain' ,CSML('profileSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
609        addchildren(self,children)
610        csElement.__init__(self,**kwargs)
611       
612class SectionDomain(ReferenceableGrid, DomainSet, csElement):
613    def __init__(self, **kwargs):
614        DomainSet.__init__(self,**kwargs)
615        ReferenceableGrid.__init__(self,**kwargs)
616        children={}
617        addchildren(self,children)
618        csElement.__init__(self,**kwargs)
619       
620class SectionCoverage(AbstractDiscreteCoverage,csElement):
621    def __init__(self, **kwargs):
622        AbstractDiscreteCoverage.__init__(self,**kwargs)
623        children={'sectionDomain':[CSML('SectionDomain'),'SectionDomain' ,CSML('sectionDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
624        addchildren(self,children)
625        csElement.__init__(self,**kwargs)
626       
627class TrajectoryDomain(ReferenceableGrid, DomainSet, csElement):
628    def __init__(self, **kwargs):
629        DomainSet.__init__(self,**kwargs)
630        ReferenceableGrid.__init__(self,**kwargs)
631        children={}
632        addchildren(self,children)
633        csElement.__init__(self,**kwargs)
634       
635class TrajectoryCoverage(AbstractDiscreteCoverage,csElement):
636    def __init__(self, **kwargs):
637        AbstractDiscreteCoverage.__init__(self,**kwargs)
638        children={'trajectoryDomain':[CSML('TrajectoryDomain'),'TrajectoryDomain' ,CSML('trajectoryDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
639        addchildren(self,children)
640        csElement.__init__(self,**kwargs)
641
642class ScanningRadarDomain(ReferenceableGrid, DomainSet, csElement):
643    def __init__(self, **kwargs):
644        DomainSet.__init__(self,**kwargs)
645        ReferenceableGrid.__init__(self,**kwargs)
646        children={}
647        addchildren(self,children)
648        csElement.__init__(self,**kwargs)
649       
650class ScanningRadarCoverage(AbstractDiscreteCoverage,csElement):
651    def __init__(self, **kwargs):
652        AbstractDiscreteCoverage.__init__(self,**kwargs)
653        children={'scanningRadarDomain':[CSML('ScanningRadarDomain'),'ScanningRadarDomain' ,CSML('scanningRadarDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
654        addchildren(self,children)
655        csElement.__init__(self,**kwargs)
656
657
658class GridSeriesDomain(ReferenceableGrid, csElement):
659    def __init__(self, **kwargs):
660        #DomainSet.__init__(self,**kwargs)
661        ReferenceableGrid.__init__(self,**kwargs)
662        children={}
663        addchildren(self,children)
664        csElement.__init__(self,**kwargs)
665
666class GridSeriesCoverage(AbstractDiscreteCoverage,csElement):
667    def __init__(self, **kwargs):
668        AbstractDiscreteCoverage.__init__(self,**kwargs)
669        children={'gridSeriesDomain':[CSML('GridSeriesDomain'),'GridSeriesDomain' ,CSML('gridSeriesDomain') ], 'rangeSet':[GML('rangeSet'), 'RangeSet'],'coverageFunction':[GML('coverageFunction'),'csString']}
670        addchildren(self,children)
671        csElement.__init__(self,**kwargs)
672
673class AlternatePointFeature(AbstractFeature, csElement):
674    def __init__(self, **kwargs):
675        AbstractFeature.__init__(self,**kwargs)
676        children={'location':[CSML('location'), 'csString'],'time':[CSML('time'), 'csString'], 'value':[CSML('AlternatePointCoverage'), 'AlternatePointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
677        addchildren(self,children)
678        csElement.__init__(self,**kwargs)
679
680class DirectPositionList(SRSReferenceGroup, csElement):
681    def __init__(self, **kwargs):
682        SRSReferenceGroup.__init__(self,**kwargs)
683        children=[]
684        addchildren(self,children)
685        csElement.__init__(self,**kwargs)
686       
687class PointFeature(AbstractFeature, csElement):
688    def __init__(self, **kwargs):
689        AbstractFeature.__init__(self,**kwargs)
690        children={'location':[CSML('location'), 'DirectPositionList'],'time':[CSML('time'), 'csString'], 'value':[CSML('PointCoverage'), 'PointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
691        addchildren(self,children)
692        csElement.__init__(self,**kwargs)
693
694class PointCollectionFeature(AbstractFeature, csElement):
695    def __init__(self, **kwargs):
696        AbstractFeature.__init__(self,**kwargs)
697        children={'time':[CSML('time'), 'csString'], 'value':[CSML('MultiPointCoverage'), 'MultiPointCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
698        addchildren(self,children)
699        csElement.__init__(self,**kwargs)
700
701
702class PointSeriesFeature(AbstractFeature, csElement):
703    def __init__(self, **kwargs):
704        AbstractFeature.__init__(self,**kwargs)
705        children={'location':[CSML('location'), 'csString'], 'value':[CSML('PointSeriesCoverage'), 'PointSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
706        addchildren(self,children)
707        csElement.__init__(self,**kwargs)
708
709
710class GridFeature(AbstractFeature, csElement):
711    def __init__(self, **kwargs):
712        AbstractFeature.__init__(self,**kwargs)
713        children={'time':[CSML('time'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
714        addchildren(self,children)
715        csElement.__init__(self,**kwargs)
716
717class GridSeriesFeature(AbstractFeature, csElement):
718    def __init__(self, **kwargs):
719        AbstractFeature.__init__(self,**kwargs)
720        children={'value':[CSML('GridSeriesCoverage'), 'GridSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
721        addchildren(self,children)
722        csElement.__init__(self,**kwargs)
723
724class ProfileFeature(AbstractFeature, csElement):
725    def __init__(self, **kwargs):
726        AbstractFeature.__init__(self,**kwargs)
727        children={'time':[CSML('time'), 'csString'],'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileCoverage'), 'ProfileCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
728        addchildren(self,children)
729        csElement.__init__(self,**kwargs)
730
731class ProfileSeriesFeature(AbstractFeature, csElement):
732    def __init__(self, **kwargs):
733        AbstractFeature.__init__(self,**kwargs)
734        children={'location':[CSML('location'), 'csString'], 'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
735        addchildren(self,children)
736        csElement.__init__(self,**kwargs)
737
738class RaggedProfileSeriesFeature(AbstractFeature, csElement):
739    def __init__(self, **kwargs):
740        AbstractFeature.__init__(self,**kwargs)
741        children={'location':[CSML('location'), 'csString'], 'profileLength':[CSML('profileLength'), 'csString'],'value':[CSML('ProfileSeriesCoverage'), 'ProfileSeriesCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
742        addchildren(self,children)
743        csElement.__init__(self,**kwargs)
744
745class RaggedSectionFeature(AbstractFeature, csElement):
746    def __init__(self, **kwargs):
747        AbstractFeature.__init__(self,**kwargs)
748        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'csString'],'profileLength':[CSML('profileLength'),'csString'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
749        addchildren(self,children)
750        csElement.__init__(self,**kwargs)
751
752class SectionFeature(AbstractFeature, csElement):
753    def __init__(self, **kwargs):
754        AbstractFeature.__init__(self,**kwargs)
755        children={'stationLocations':[CSML('stationLocations'), 'csString'], 'stationTimes':[CSML('stationTimes'), 'TimePositionList'],'value':[CSML('SectionCoverage'), 'SectionCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
756        addchildren(self,children)
757        csElement.__init__(self,**kwargs)
758
759class ScanningRadarFeature(AbstractFeature, csElement):
760    def __init__(self, **kwargs):
761        AbstractFeature.__init__(self,**kwargs)
762        children={'elevation':[CSML('elevation'), 'csString'], 'value':[CSML('ScanningRadarCoverage'), 'ScanningRadarCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
763        addchildren(self,children)
764        csElement.__init__(self,**kwargs)
765
766       
767class SwathFeature(AbstractFeature, csElement):
768    def __init__(self, **kwargs):
769        AbstractFeature.__init__(self,**kwargs)
770        children={'eqCrossLon':[CSML('eqCrossLon'), 'csString'],'eqCrossTime':[CSML('eqCrossTime'), 'csString'], 'value':[CSML('ReferenceableGridCoverage'), 'ReferenceableGridCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
771        addchildren(self,children)
772        csElement.__init__(self,**kwargs)
773       
774class TrajectoryFeature(AbstractFeature, csElement):
775    def __init__(self, **kwargs):
776        AbstractFeature.__init__(self,**kwargs)
777        children={'value':[CSML('TrajectoryCoverage'), 'TrajectoryCoverage', CSML('value')], 'parameter':[CSML('parameter'), 'Phenomenon']}
778        addchildren(self,children)
779        csElement.__init__(self,**kwargs)
780       
781class FileList(AssociationAttributeGroup,AbstractGML,csElement):
782    def __init__(self,**kwargs):
783        AssociationAttributeGroup.__init__(self,**kwargs)
784        AbstractGML.__init__(self,**kwargs)
785        addatts(self,[])
786        children= {'fileNames':[CSML('fileNames'), 'csString']}
787        addchildren(self,children)
788        csElement.__init__(self,**kwargs)
789       
790class FileExtract(ArrayDescriptor, csElement):
791    def __init__(self,**kwargs):
792        ArrayDescriptor.__init__(self,**kwargs)
793        children= {'fileName':[CSML('fileName'), 'csString'],  'fileList':[CSML('FileList'), 'FileList', CSML('fileList')],'fileListXLINK':[CSML('fileList'), 'csString']}
794        addchildren(self,children)
795        csElement.__init__(self,**kwargs)
796
797class NetCDFExtract(FileExtract, csElement):
798    def __init__(self,**kwargs):
799        FileExtract.__init__(self, **kwargs)
800        children={'variableName':[CSML('variableName'), 'csString']}
801        addchildren(self,children)
802        csElement.__init__(self,**kwargs)
803
804class NASAAmesExtract(FileExtract, csElement):
805    def __init__(self,**kwargs):
806        FileExtract.__init__(self, **kwargs)
807        children={'variableName':[CSML('variableName'), 'csString'], 'index':[CSML('index'),'csString']}
808        addchildren(self,children)
809        csElement.__init__(self,**kwargs)
810
811class CSMLStorageDescriptor(csElement):
812    def __init__(self,**kwargs):
813        addatts(self,[])
814        children={'descriptors':[[CSML('NetCDFExtract'),CSML('AggregatedArray')], 'FileExtract', CSML('descriptor'),1]}
815        addchildren(self,children)
816        csElement.__init__(self,**kwargs)
817
818class CSMLFeatureCollection(AbstractFeatureCollection,csElement,):
819    def __init__(self,**kwargs):
820        AbstractFeatureCollection.__init__(self,**kwargs)
821        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]}
822        addchildren(self,children)
823        csElement.__init__(self,**kwargs)
824    def _getSubstitutionType(self,tag):
825        if tag==CSML('GridFeature'):
826            return 'GridFeature'
827        elif tag==CSML('GridSeriesFeature'):
828            return 'GridSeriesFeature'
829        elif tag==CSML('PointFeature'):
830            return 'PointFeature'
831        elif tag==CSML('TrajectoryFeature'):
832            return 'TrajectoryFeature'
833        elif tag==CSML('PointSeriesFeature'):
834            return 'PointSeriesFeature'
835        elif tag==CSML('ProfileFeature'):
836            return 'ProfileFeature'
837        elif tag==CSML('ProfileSeriesFeature'):
838            return 'ProfileSeriesFeature'
839        elif tag==CSML('RaggedProfileSeriesFeature'):
840            return 'RaggedProfileSeriesFeature'
841        elif tag==CSML('RaggedSectionFeature'):
842            return 'RaggedSectionFeature'
843        elif tag==CSML('SectionFeature'):
844            return 'SectionFeature'
845        elif tag==CSML('ScanningRadarFeature'):
846            return 'ScanningRadarFeature'
847        elif tag==CSML('AlternatePointFeature'):
848            return 'AlternatePointFeature'
849        else: return 'AbstractFeature'
850    def _getReverseSubsType(self, typename):
851        if typename== 'GridFeature':
852            return CSML('GridFeature')
853        elif typename == 'GridSeriesFeature':
854            return CSML('GridSeriesFeature')
855        elif typename == 'PointSeriesFeature':
856            return CSML('PointSeriesFeature')
857        elif typename == 'ProfileFeature':
858            return CSML('ProfileFeature')
859        elif typename == 'ProfileSeriesFeature':
860            return CSML('ProfileSeriesFeature')
861        elif typename == 'SectionFeature':
862            return CSML('SectionFeature')
863        elif typename == 'ScanningRadarFeature':
864            return CSML('ScanningRadarFeature')
865        elif typename == 'RaggedSectionFeature':
866            return CSML('RaggedSectionFeature')
867        elif typename == 'RaggedProfileSeriesFeature':
868            return CSML('RaggedProfileSeriesFeature')
869        elif typename == 'PointFeature':
870            return CSML('PointFeature')
871        elif typename == 'TrajectoryFeature':
872            return CSML('TrajectoryFeature')
873        elif typename == 'AlternatePointFeature':
874            return CSML('AlternatePointFeature')
875        else: return CSML('AbstractFeature')
876
877       
878class Dataset(csElement):   
879    ''' Dataset class, needed as root of tree'''
880    def __init__(self, **kwargs):
881        a=[CSML('id')]
882        addatts(self,a)
883        children = {'featureCollection':[CSML('CSMLFeatureCollection') ,'CSMLFeatureCollection'],'storageDescriptor':[CSML('CSMLStorageDescriptor'), 'CSMLStorageDescriptor']}
884        addchildren(self,children)
885        csElement.__init__(self,**kwargs)
886   
887    def toXML(self):
888        csmlfrag=ET.Element(CSML('Dataset'))
889        csElement.toXML(self, csmlfrag)
890        return csmlfrag
891    #def _getSubstitutionType(self,tag): 
892        #if tag==CSML('NetCDFExtract'):
893            #return 'NetCDFExtract'
894        #elif tag==CSML('NASAAmesExtract'):
895            #return 'NASAAmesExtract'
896        #else: return 'ArrayDescriptor'
897    #def _getReverseSubsType(self, typename):
898        #if typename== 'NetCDFExtract':
899            #return CSML('NetCDFExtract')
900        #elif typename == 'NASAAmesExtract':
901            #return CSML('NASAAmesExtract')
902        #else: return CSML('ArrayDescriptor')
903       
904        return typename
905
906   
907def main():
908    '''round trip for testing purposes:'''
909    import parser_extra
910   
911    print '\n'
912    tree=ET.ElementTree(file='test.xml')
913    ds=Dataset()
914    ds.fromXML(tree.getroot())
915    csmltree=ds.toXML()
916    #print csmltree
917   
918    csmlout=parser_extra.PrettyPrint(csmltree)
919    csmlout=parser_extra.removeInlineNS(csmlout)
920    print '\n %s'% csmlout
921    #for member in ds.featureCollection.members:
922      #print dir(member.value)
923       
924
925if __name__=='__main__':
926    main()
Note: See TracBrowser for help on using the repository browser.