source: TI02-CSML/trunk/csml2MolesStuff/molesWriter.py @ 1629

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

moles roundtripping

Line 
1#prototype MOLES  generation code. Dominic Lowe, BADC  18 October 2006
2
3import cElementTree as ET
4import csml.parser_extra #note this is only used for pretty printing - there's no dependency on the CSML parser
5class molesElement(object):
6    def __init__(self, **kwargs):
7        for kw in kwargs:
8            setattr(self,kw,kwargs[kw])
9    def toXML(self,molesFrag):
10        for attr in self.__dict__:
11            if isinstance(self.__dict__[attr], molesElement):
12                frag=ET.Element(attr)
13                self.__dict__[attr].toXML(frag)
14                molesFrag.append(frag)
15            elif isinstance(self.__dict__[attr], list):
16                for item in self.__dict__[attr]:
17                    if isinstance(item, molesElement):
18                        frag=ET.Element(attr)
19                        item.toXML(frag)
20                        molesFrag.append(frag)
21                    else:
22                        frag=ET.Element(attr)
23                        frag.text=item
24            else:
25                frag=ET.Element(attr)
26                frag.text=self.__dict__[attr]
27                molesFrag.append(frag)
28        return molesFrag
29           
30    def fromXML(self,molesFrag):
31        print molesFrag.tag
32        children = molesFrag.getchildren()
33        if children ==[]:
34            print 'no children'
35        if children!=[]:
36            print 'has children'
37            for child in children:
38                print child
39                if child.getchildren()!=[]:
40                    newClass=type(child.tag, (molesElement,),{})
41                    newChild=newClass()
42                    newChild.fromXML(child)
43                    kw=child.tag
44                    setattr(self,child.tag, newChild)
45               
46           
47
48class dgMetadata(molesElement):   
49    def __init__(self, **kwargs):
50        molesElement.__init__(self, **kwargs)
51    def toXML(self):
52        molesFrag=ET.Element('dgMetadata')
53        molesElement.toXML(self,molesFrag)
54        return molesFrag
55
56
57class MolesDoc(object):
58    def __init__(self):
59        pass
60   
61    def _create_a_class(self,name, base_class):
62        aNewClass=type(name, (base_class,),{})
63        return aNewClass
64
65    def _createClasses(self):
66        #if you want more classes just add their names to this list
67        classList= \
68        ['dataModelID', \
69        'dgDataGranule', \
70        'dgDataEntity', \
71        'dgMetadataRecord', \
72        'dgMetadataID', 
73        'dgCoverage', \
74        'dgSpatioTemporalCoverage', \
75        'dgSpatialCoverage', \
76        'dgTemporalCoverage', \
77        'dgBoundingBox', \
78        'DateRange', \
79        'dgDataSummary',\
80        'dgParameterSummary',\
81        'dgRangeDataParameter',\
82        'dgStdParameterMeasured',\
83        'dgStandardUnit',\
84        'dgValidTermID',\
85        'metadataDescriptionID',\
86        'dgMetadataDescription', \
87        'fruit']
88
89        for className in classList:
90            newClass=self._create_a_class(className, molesElement)
91            setattr(self,className,newClass)
92
93# def main():
94#     #example how to create classes:
95#     M=MolesDoc()
96#     M._createClasses()
97#     
98#     '''create your moles doc by setting attributes of "M.className"
99#     the classNames used must be declared in molesWriter.MolesDoc.classList'''
100#     dgMID=M.dgMetadataID(schemeIdentifier='NDG-B0', repositoryIdentifier='badc.nerc.ac.uk', localIdentifier='COAPEC_HadCM3_500Yr')
101#     dmID= M.dataModelID(schemeIdentifier='NDG-A0', repositoryIdentifier='badc.nerc.ac.uk', localIdentifier='COAPEC_500YrRun_wholerun_annual_atmos')
102#     dmID2= M.dataModelID(schemeIdentifier='NDG-A0', repositoryIdentifier='badc.nerc.ac.uk', localIdentifier='COAPEC_500YrRun_wholerun_annual_oceanls')
103#     DG1 = M.dgDataGranule(dataModelID=dmID)
104#     DG2 = M.dgDataGranule(dataModelID=dmID2)
105#     dgDE= M.dgDataEntity(dgDataGranule=[DG1,DG2])
106#     dgMR=M.dgMetadataRecord(dgMetadataID=dgMID, dgDataEntity=dgDE)
107#     dgMeta=dgMetadata(dgMetadataRecord=dgMR)
108#
109#     #print it out.
110#     molestree=dgMeta.toXML()
111#     moles=csml.parser_extra.PrettyPrint(molestree)
112#     print moles
113#
114# if __name__=='__main__':
115#     main()
Note: See TracBrowser for help on using the repository browser.