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

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

changed molesWriter.py so that classes are generated by a function call rather than defined explicitly - this should make it easier to add new classes in future

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
5
6class molesElement(object):
7    def __init__(self, **kwargs):
8        for kw in kwargs:
9            setattr(self,kw,kwargs[kw])   
10    def toXML(self,molesFrag):
11        for attr in self.__dict__:
12            if isinstance(self.__dict__[attr], molesElement):
13                subelem = self.__dict__[attr]
14                frag=ET.Element(attr)
15                for attrib in subelem.__dict__:
16                    if isinstance(subelem.__dict__[attrib], molesElement):
17                        subfrag=ET.Element(attrib)
18                        subelem.__dict__[attrib].toXML(subfrag)
19                        frag.append(subfrag)
20                    else:
21                        frag.text=attrib
22                molesFrag.append(frag)
23            elif isinstance(self.__dict__[attr], list):
24                for item in self.__dict__[attr]:
25                    if isinstance(item, molesElement):
26                        subelem = item
27                        frag=ET.Element(attr)
28                        for attrib in subelem.__dict__:
29                            if isinstance(subelem.__dict__[attrib], molesElement):
30                                subfrag=ET.Element(attrib)
31                                subelem.__dict__[attrib].toXML(subfrag)
32                                frag.append(subfrag)
33                            else:
34                                frag.text=attrib
35                        molesFrag.append(frag)   
36                    else:
37                        frag=ET.Element(attr)
38                        frag.text=self.__dict__[attr]           
39                        molesFrag.append(frag)
40            else:
41                frag=ET.Element(attr)
42                frag.text=self.__dict__[attr]           
43                molesFrag.append(frag)
44        return molesFrag
45
46
47class dgMetadata(molesElement):   
48    def __init__(self, **kwargs):
49        molesElement.__init__(self, **kwargs)
50    def toXML(self):
51        molesFrag=ET.Element('dgMetadata')
52        molesElement.toXML(self,molesFrag)
53        return molesFrag
54
55
56class MolesDoc(object):
57    def __init__(self):
58        pass
59   
60    def _create_a_class(self,name, base_class):
61        aNewClass=type(name, (base_class,),{})
62        return aNewClass
63
64    def _createClasses(self):
65        self.dataModelID=self._create_a_class('dataModelID', molesElement,)
66        self.dgDataGranule=self._create_a_class('dgDataGranule', molesElement)
67        self.dgDataEntity=self._create_a_class('dgDataGranule', molesElement)
68        self.dgMetadataRecord=self._create_a_class('dgMetadataRecord', molesElement)
69        self.dgMetadataID=self._create_a_class('dgMetadataID', molesElement)
70
71def main():
72    #create classes:
73    M=MolesDoc()
74    M._createClasses()
75   
76    #create your moles doc by setting attributes.
77    dgMID=M.dgMetadataID(schemeIdentifier='NDG-B0', repositoryIdentifier='badc.nerc.ac.uk', localIdentifier='COAPEC_HadCM3_500Yr')
78    dmID= M.dataModelID(schemeIdentifier='NDG-A0', repositoryIdentifier='badc.nerc.ac.uk', localIdentifier='COAPEC_500YrRun_wholerun_annual_atmos')
79    dmID2= M.dataModelID(schemeIdentifier='NDG-A0', repositoryIdentifier='badc.nerc.ac.uk', localIdentifier='COAPEC_500YrRun_wholerun_annual_oceanls')
80    DG1 = M.dgDataGranule(dataModelID=dmID)
81    DG2 = M.dgDataGranule(dataModelID=dmID2)
82    dgDE= M.dgDataEntity(dgDataGranule=[DG1,DG2])
83    dgMR=M.dgMetadataRecord(dgMetadataID=dgMID, dgDataEntity=dgDE)
84    dgMeta=dgMetadata(dgMetadataRecord=dgMR)
85
86    #print it out.
87    molestree=dgMeta.toXML()
88    moles=csml.parser_extra.PrettyPrint(molestree)
89    print moles
90
91if __name__=='__main__':
92    main()
Note: See TracBrowser for help on using the repository browser.