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

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

removed self.NAMESPACE and moved ownership of namespace to individual elements rather than to classes

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