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

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

basic attribute support

Line 
1import cElementTree as ET
2import csml.parser_extra
3
4'''CSML v2 Parser ''' 
5
6nsCSML = 'http://ndg.nerc.ac.uk/csml'
7nsGML = 'http://www.opengis.net/gml'
8#etc... add more
9
10
11def Merge(dict1, dict2):
12    '''merges (adds) two dictionary objects, used in attribute 'inheritance.'''
13    dict3={}
14    for item in dict1:
15        dict3[item] =dict1[item]
16    for item in dict2:
17        dict3[item] =dict2[item]
18    return dict3
19
20class csElement(object):
21    ''' main csElement class - all other elements inherit from this baseclass 
22    all the from/to XML conversion is done by this class'''
23   
24    def __init__(self, **kwargs):
25        if not hasattr(self, 'ATTRIBUTES'):
26            self.ATTRIBUTES=[]
27           
28       
29    def __myQName(self,uri,tag):
30        return "{"+uri+"}"+tag
31   
32    def __removeURI(self, qname):
33        try:
34            attname = qname.split('}')[1]
35        except IndexError:
36            attname = qname
37        return attname
38
39    def toXML(self, csmlfrag):
40    #process self... and convert  to XML
41    # self.ATTRIBUTES
42        for item in self.__dict__:
43            print item
44            if self.__removeURI(item) in self.ATTRIBUTES:
45                print 'yes'
46                csmlfrag.set(item, self.__dict__[item])
47    # self.CHILDREN (recursive - calls the toXML method of children)
48        for att in self.__dict__:
49            if att not in ['NAMESPACE', 'ATTRIBUTES', 'CHILDREN', 'CONTENT']:
50                for child in self.CHILDREN:
51                    if child == att:
52                        #found a match.
53                        ename = self.CHILDREN[child][0] #Element Name
54                        etype = self.CHILDREN[child][1] #Element Type
55                        if type(self.__dict__[att])  is list:
56                            for item in self.__dict__[att]:
57                                frag=ET.Element(ename)
58                                if self.CONTENT is not None:
59                                    frag.text=self.CONTENT
60                                item.toXML(frag)
61                                csmlfrag.append(frag)
62                        else:
63                            frag=ET.Element(ename)
64                            if self.CONTENT is not None:
65                                    frag.text=self.CONTENT
66                            self.__dict__[att].toXML(frag)
67                            csmlfrag.append(frag)
68        return csmlfrag
69       
70    def fromXML(self,csmlfrag):
71        # deal with attributes, e.g. gml id's
72        for item in csmlfrag.items():
73            if self.__removeURI(item[0]) in self.ATTRIBUTES:
74                setattr(self, item[0], item[1])
75                print "DONE"
76        # self.CHILDREN (recursive - calls the fromXML method of children
77        for frag in csmlfrag[:]: 
78            if frag.text is not None:
79                self.CONTENT = frag.text
80            for child in self.CHILDREN:
81                ename = self.CHILDREN[child][0] #Element Name
82                if frag.tag == self.__myQName(self.NAMESPACE, ename):
83                    etype = self.CHILDREN[child][1]
84                    #Element Type                    #elem = ET.Element(ename)
85                    childobj=eval(etype)()
86                    childobj.fromXML(frag)
87                    if hasattr(self, child):
88                        if type(self.__dict__[child]) is not list:
89                            tmp=self.__dict__[child]
90                            setattr(self, child, [tmp]) #convert to list
91                        self.__dict__[child].append(childobj)
92                    else:
93                        setattr(self, child, childobj)
94
95class csString(csElement):
96    pass
97
98class AbstractGML(csElement):
99   
100    def __init__(self, **kwargs):
101        self.ATTRIBUTES=['id', 'description'] # etc
102    #ATTRIBUTES not implemented yet.
103   
104
105class AbstractFileExtract(AbstractGML, csElement):
106    def __init__(self,**kwargs):
107        AbstractGML.__init__(self,**kwargs)
108        self.NAMESPACE= nsCSML
109        self.CHILDREN = {'fileName':['fileName', 'csString']}
110
111class NetCDFExtract(AbstractFileExtract, csElement):
112    def __init__(self,**kwargs):
113        AbstractFileExtract.__init__(self, **kwargs)
114        self.NAMESPACE= nsCSML
115        self.CHILDREN = Merge(self.CHILDREN,{'variableName':['variableName', 'csString']})
116        #use Merge() when inheriting CHILDREN attribute to extend rather than replace
117
118
119class Dataset(AbstractGML, csElement):   
120    ''' Dataset class, needed as root of tree'''
121    def __init__(self, **kwargs):
122        AbstractGML.__init__(self,**kwargs)
123        self.NAMESPACE=nsCSML
124        self.CHILDREN = {'ncExtract':['NetCDFExtract', 'NetCDFExtract']}
125    def toXML(self):
126        csmlfrag=ET.Element('Dataset')
127        csElement.toXML(self, csmlfrag)
128        return csmlfrag
129
130def main():
131    '''round trip for testing purposes:'''
132    tree=ET.ElementTree(file='test.xml')
133    ds=Dataset()
134    ds.fromXML(tree.getroot())
135    csmltree=ds.toXML()
136    #print csmltree
137    csmlout=csml.parser_extra.PrettyPrint(csmltree)
138    print csmlout
139    #print dir(csmlout)
140
141
142if __name__=='__main__':
143    main()
Note: See TracBrowser for help on using the repository browser.