source: TI02-CSML/trunk/csml/parser_extra.py @ 2642

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

Helping csml work in python 2.5 (finding celementtree :-)

Line 
1#parser_extra.py
2# DL 12 april 2006
3#v2 DL 22 November 2006: changed namespaces to reflect v2 schema
4# 'extra' functions to enable parsing.
5#contains:
6#. Namespace fix
7# Function to resolve references in CSML doc.
8
9import csml
10import csml.parser
11import sys
12try: #python 2.5
13    from xml.etree import ElementTree as etree
14    from xml.etree import cElementTree as ET
15except ImportError:
16    try:
17        # if you've installed it yourself it comes this way
18        import ElementTree as etree
19        import cElementTree as ET
20    except ImportError:
21        # if you've egged it this is the way it comes
22        from elementtree import ElementTree as etree
23        from elementtree import cElementTree as ET
24import string
25import codecs
26
27
28#some xml/string manipulation functions. may as well go in this file for now:
29
30def encodingParser(file, encoding):
31    f = codecs.open(file, "r", encoding)
32    p = ET.XMLParser(encoding="utf-8")
33    while 1:
34        s = f.read(65536)
35        if not s:
36            break
37        p.feed(s.encode("utf-8"))
38    return ET.ElementTree(p.close())
39
40
41def PrettyPrint(elem,indent='',html=0,space='   '):
42        '''Lightweight pretty printing of elementTree elements'''
43        def estrip(elem):
44                ''' Just want to get rid of unwanted whitespace '''
45                if elem is None:
46                        return ''
47                else:
48                        return elem.strip()
49        strAttrib=''
50        for att in elem.attrib:
51                strAttrib+=' %s="%s"'%(att,elem.attrib[att])
52        result='%s<%s%s>%s'%(indent,elem.tag,strAttrib,estrip(elem.text))
53        children=len(elem)
54        if children:
55                for item in elem:
56                        result+='\n'+PrettyPrint(item,indent=indent+space)
57                result+='\n%s%s</%s>'%(indent,estrip(item.tail),elem.tag)
58        else:
59                result+='</%s>'%(elem.tag)
60        return result
61
62# fixing up namespaces:
63def removeInlineNS(csmlstring):
64        #  removeInlineNS: function removes "inline" namespaces and declares them as part of the Dataset element.
65   
66        #replace any fully qualified namespaces
67        csmlstring=csmlstring.replace('{http://www.opengis.net/gml}', 'gml:')
68        csmlstring=csmlstring.replace('{http://ndg.nerc.ac.uk/csml}','')
69        csmlstring=csmlstring.replace('{http://www.w3.org/1999/xlink}','xlink:')
70        csmlstring=csmlstring.replace('{http://www.opengis.net/om}','om:')
71        csmlstring=csmlstring.replace('{http://www.opengis.net/swe}','swe:')               
72        csmlstring=csmlstring.replace('{http://ndg.nerc.ac.uk/moles}','moles:')
73        #remove cmsl: prefixes
74        csmlstring=csmlstring.replace('<csml:','<')
75        csmlstring=csmlstring.replace('</csml:','</')
76       
77        #add namespace declarations at top of document
78        csmlstring=csmlstring.replace('<Dataset', '<Dataset xmlns="http://ndg.nerc.ac.uk/csml"  xmlns:gml="http://www.opengis.net/gml" xmlns:om="http://www.opengis.net/om" xmlns:swe="http://www.opengis.net/swe"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:moles="http://ndg.nerc.ac.uk/moles"  xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://ndg.nerc.ac.uk/csml  csmlDataset.xsd"')
79       
80        #this is only used when creating a new csml document
81        csmlstring=csmlstring.replace('ns0', 'gml')
82        csmlstring=csmlstring.replace('xmlns:ns1', 'xmlns:xlink')
83        csmlstring=csmlstring.replace('ns1:href', 'xlink:href')
84        csmlstring=csmlstring.replace('ns1:moles', 'xlink:moles')
85        csmlstring=csmlstring.replace('ns1:', '')  #the rest of the ns1s are CSML namespaces... due to the way it has been parsed.       
86        #what about SWE - need to check this ********TODO*****
87        return csmlstring
88
89
90def isURI(uri):
91    """ a very simple function to test if a string is a uri
92    if ;// appears in the first 12 characters it is probably a uri """
93    #TODO - a decent uri check!   
94    result = False
95    if string.find(uri[:12], '://') != -1:
96        result = True
97    return result
98
99
100class ParserPostProcessor:
101    def __init__(self,dataset): 
102       
103        self.dataset=dataset
104       
105    def __findFLmatch(self, href):
106        for sd in csml.csmllibs.csmlextra.listify(self.dataset.storageDescriptor.descriptors):
107            if type(sd)==csml.parser.AggregatedArray:
108                for comp in csml.csmllibs.csmlextra.listify(sd.components):
109                    if hasattr(comp, 'fileList'):
110                        if hasattr(comp.fileList, 'id'):
111                            if comp.fileList.id==href:
112                                return comp.fileList
113       
114                       
115    def __findSDmatch(self, href):     
116        for sd in csml.csmllibs.csmlextra.listify(self.dataset.storageDescriptor.descriptors):
117            if type(sd) in [csml.parser.NetCDFExtract, csml.parser.AggregatedArray]:
118                if hasattr(sd, 'id'):
119                     if sd.id == href:
120                        return sd
121                       
122               
123       
124    def resolveReferences(self):
125        #Need to do this in more simple manner! for each xlink, call csml.csmllibs.csmlxlink.resolveXlink()
126       
127        #start with fileLists in the the storage descriptors:
128        if hasattr(self.dataset, 'storageDescriptor'):
129            if hasattr(self.dataset.storageDescriptor, 'descriptors'):
130                for sd in csml.csmllibs.csmlextra.listify(self.dataset.storageDescriptor.descriptors):
131                    if type(sd)==csml.parser.AggregatedArray:
132                        for comp in csml.csmllibs.csmlextra.listify(sd.components):
133                            if hasattr(comp, 'fileListXLINK'):
134                                if hasattr(comp.fileListXLINK, 'href'):                               
135                                    fList = self.__findFLmatch(comp.fileListXLINK.href[1:])
136                                    if fList is not None:
137                                        comp.fileList =fList
138                                        del comp.fileListXLINK
139       
140        # now handle any xlinks in the domain:
141        for feature in csml.csmllibs.csmlextra.listify(self.dataset.featureCollection.featureMembers):
142            cvg = feature.value
143            for att in ['gridSeriesDomain', 'pointDomain', 'profileSeriesDomain','blah blah']:
144                if hasattr(cvg, att):
145                    domain=getattr(cvg,att)
146                    for ordinate in domain.coordTransformTable.gridOrdinates:
147                        if hasattr(ordinate.coordAxisValues,'href'):
148                            if ordinate.coordAxisValues.arcrole.split('#')[1] in ['coordinateList', 'timePositionList']:
149                                dataforClist= self.__findSDmatch(ordinate.coordAxisValues.href[1:])
150                            if dataforClist is not None:
151                                    setattr(ordinate.coordAxisValues, 'insertedExtract', dataforClist)
152                    break
153           
154            #now the rangeSet:
155            if hasattr(feature.value.rangeSet, 'valueArray'):
156                #could be an xlink here..
157                for vc in  csml.csmllibs.csmlextra.listify(feature.value.rangeSet.valueArray.valueComponent):
158                    if hasattr(vc, 'href'):
159                        dataforQlist=self.__findSDmatch(vc.href[1:])
160                        if dataforQlist is not None:
161                            setattr(vc, 'insertedExtract', dataforQlist)
162
163        return self.dataset
164                                           
Note: See TracBrowser for help on using the repository browser.