root/OWSLib/trunk/owslib/iso.py

Revision 1309, 13.2 KB (checked in by tomkralidis, 9 months ago)

handle empty keyword list and add ISO objects

Line 
1#!/usr/bin/python
2# -*- coding: ISO-8859-15 -*-
3# =============================================================================
4# Copyright (c) 2009 Tom Kralidis
5#
6# Authors : Tom Kralidis <tomkralidis@hotmail.com>
7#
8# Contact email: tomkralidis@hotmail.com
9# =============================================================================
10
11""" ISO metadata parser """
12
13import StringIO
14from owslib.etree import etree
15from owslib import util
16
17# default variables
18
19namespaces = {
20    None : 'http://www.isotc211.org/2005/gmd',
21    'gco': 'http://www.isotc211.org/2005/gco',
22    'gmd': 'http://www.isotc211.org/2005/gmd',
23    'gts': 'http://www.isotc211.org/2005/gts',
24    'srv': 'http://www.isotc211.org/2005/srv',
25    'xlink': 'http://www.w3.org/1999/xlink'
26}
27
28class MD_Metadata(object):
29    """ Process gmd:MD_Metadata """
30    def __init__(self, md):
31        val = md.find(util.nspath('fileIdentifier', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
32        self.identifier = util.testXMLValue(val)
33
34        val = md.find(util.nspath('language', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
35        self.language = util.testXMLValue(val)
36
37        val = md.find(util.nspath('characterSet/MD_CharacterSetCode', namespaces['gmd'])).attrib.get('codeListValue')
38        self.charset = util.testXMLValue(val, True)
39 
40        val = md.find(util.nspath('hierarchyLevel/MD_ScopeCode', namespaces['gmd'])).attrib.get('codeListValue')
41        self.hierarchy = util.testXMLValue(val, True)
42
43        val = md.find(util.nspath('contact/CI_ResponsibleParty', namespaces['gmd']))
44        if val:
45            self.contact = CI_ResponsibleParty(val)
46        else:
47            self.contact = None
48
49        val = md.find(util.nspath('dateStamp', namespaces['gmd']) + '/' + util.nspath('DateTime', namespaces['gco']))
50        self.datestamp = util.testXMLValue(val)
51       
52        val = md.find(util.nspath('metadataStandardName', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
53        self.stdname = util.testXMLValue(val)
54
55        val = md.find(util.nspath('metadataStandardVersion', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
56        self.stdver = util.testXMLValue(val)
57
58        val = md.find(util.nspath('referenceSystemInfo/MD_ReferenceSystem', namespaces['gmd']))
59        if val:
60            self.referencesystem = MD_ReferenceSystem(val)
61        else:
62            self.referencesystem = None
63
64        val = md.find(util.nspath('identificationInfo/MD_DataIdentification', namespaces['gmd']))
65        val2 = md.find(util.nspath('identificationInfo', namespaces['gmd']) + '/' + util.nspath('SV_ServiceIdentification', namespaces['srv']))
66
67        if val:
68            self.identification = MD_DataIdentification(val, 'dataset')
69        elif val2:
70            self.identification = MD_DataIdentification(val2, 'service')
71            self.identification.service = SV_ServiceIdentification(val2)
72        else:
73            self.identification = None
74
75        val = md.find(util.nspath('distributionInfo/MD_Distribution', namespaces['gmd']))
76        if val:
77            self.distribution = MD_Distribution(val)
78        else:
79            self.distribution = None
80
81class CI_ResponsibleParty(object):
82    """ process CI_ResponsibleParty """
83    def __init__(self, md):
84        val = md.find(util.nspath('individualName', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
85        self.name = util.testXMLValue(val)
86
87        val = md.find(util.nspath('organisationName', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
88        self.organization = util.testXMLValue(val)
89
90        val = md.find(util.nspath('positionName', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
91        self.position = util.testXMLValue(val)
92
93        val = md.find(util.nspath('contactInfo/CI_Contact/phone/CI_Telephone/voice', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
94        self.phone = util.testXMLValue(val)
95
96        val = md.find(util.nspath('contactInfo/CI_Contact/phone/CI_Telephone/facsimile', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
97        self.fax = util.testXMLValue(val)
98
99        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/deliveryPoint', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
100        self.address = util.testXMLValue(val)
101
102        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/city', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
103        self.city = util.testXMLValue(val)
104
105        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/administrativeArea', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
106        self.region = util.testXMLValue(val)
107
108        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/postalCode', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
109        self.postcode = util.testXMLValue(val)
110
111        val = md.find(util.nspath('contactInfo/CI_Contact/address/CI_Address/country', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
112        self.country = util.testXMLValue(val)
113
114        val = md.find(util.nspath('contactInfo/CI_Contact/onlineResource/CI_OnlineResource', namespaces['gmd']))
115        if val:
116          self.onlineresource = CI_OnlineResource(val)
117        else:
118          self.onlineresource = None
119     
120        val = md.find(util.nspath('role/CI_RoleCode', namespaces['gmd'])).attrib.get('codeListValue')
121        self.role = util.testXMLValue(val, True)
122
123class MD_DataIdentification(object):
124    """ process MD_DataIdentification """
125    def __init__(self, md, identtype):
126        self.identtype = identtype
127        val = md.find(util.nspath('citation/CI_Citation/title', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
128        self.title = util.testXMLValue(val)
129
130        val = md.find(util.nspath('citation/CI_Citation/date/CI_Date/date', namespaces['gmd']) + '/' + util.nspath('DateTime', namespaces['gco']))
131        self.date = util.testXMLValue(val)
132
133        val = md.find(util.nspath('citation/CI_Citation/date/CI_Date/dateType/CI_DateTypeCode', namespaces['gmd'])).attrib.get('codeListValue')
134        self.datetype = util.testXMLValue(val, True)
135
136        val = md.find(util.nspath('abstract', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
137        self.abstract = util.testXMLValue(val)
138
139        val = md.find(util.nspath('purpose', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
140        self.purpose = util.testXMLValue(val, True)
141
142        val = md.find(util.nspath('status/MD_ProgressCode', namespaces['gmd'])).attrib.get('codeListValue')
143        self.status = util.testXMLValue(val, True)
144
145        val = md.find(util.nspath('pointOfContact/CI_ResponsibleParty', namespaces['gmd']))
146
147        if val:
148            self.contact = CI_ResponsibleParty(val)
149        else:
150            self.contact = None
151
152        self.keywords = {}
153
154        val = md.find(util.nspath('descriptiveKeywords/MD_Keywords/type/MD_KeywordTypeCode', namespaces['gmd'])).attrib.get('codeListValue')
155        self.keywords['type'] = util.testXMLValue(val, True)
156
157        self.keywords['list'] = [] 
158        for i in md.findall(util.nspath('descriptiveKeywords/MD_Keywords/keyword', namespaces['gmd'])):
159            k = i.find(util.nspath('CharacterString', namespaces['gco']))
160            self.keywords['list'].append(util.testXMLValue(k))
161
162        val = md.find(util.nspath('topicCategory/MD_TopicCategoryCode', namespaces['gmd']))
163        self.topiccategory = util.testXMLValue(val)
164
165        val = md.find(util.nspath('extent/EX_Extent', namespaces['gmd']))
166
167        if val:
168            self.bbox = EX_Extent(val)
169        else:
170            self.bbox = None
171       
172class MD_Distribution(object):
173    """ process MD_Distribution """
174    def __init__(self, md):
175        val = md.find(util.nspath('distributionFormat/MD_Format/name', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
176        self.format = util.testXMLValue(val)
177
178        val = md.find(util.nspath('distributionFormat/MD_Format/version', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
179        self.version = util.testXMLValue(val)
180
181        val = md.find(util.nspath('transferOptions/MD_DigitalTransferOptions/onLine/CI_OnlineResource', namespaces['gmd']))
182
183        if val:
184            self.onlineresource = CI_OnlineResource(val)
185        else:
186            self.onlineresource = None
187       
188class SV_ServiceIdentification(object):
189    """ process SV_ServiceIdentification """
190    def __init__(self, md):
191        val = md.find(util.nspath('serviceType', namespaces['srv']) + '/' + util.nspath('LocalName', namespaces['gco']))
192        self.type = util.testXMLValue(val)
193     
194        val = md.find(util.nspath('serviceTypeVersion', namespaces['srv']) + '/' + util.nspath('CharacterString', namespaces['gco']))
195        self.version = util.testXMLValue(val)
196
197        val = md.find(util.nspath('accessProperties', namespaces['srv']) + '/' + util.nspath('MD_StandardOrderProcess/fees', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
198        self.fees = util.testXMLValue(val)
199
200        val = md.find(util.nspath('extent', namespaces['srv']) + '/' + util.nspath('EX_Extent', namespaces['gmd']))
201
202        if val:
203            self.bbox = EX_Extent(val)
204        else:
205            self.bbox = None
206
207        val = md.find(util.nspath('couplingType/SV_CouplingType', namespaces['srv'])).attrib.get('codeListValue')
208        self.couplingtype = util.testXMLValue(val, True)
209
210        self.operations = []
211
212        for i in md.findall(util.nspath('containsOperations', namespaces['srv'])):
213            tmp = {}
214            val = i.find(util.nspath('SV_OperationMetadata/operationName', namespaces['srv']) + '/' + util.nspath('CharacterString', namespaces['gco']))
215            tmp['name'] = util.testXMLValue(val)
216            tmp['dcplist'] = []
217            for d in i.findall(util.nspath('SV_OperationMetadata/DCP', namespaces['srv'])):
218                tmp2 = d.find(util.nspath('DCPList', namespaces['srv'])).attrib.get('codeListValue')
219                tmp['dcplist'].append(util.testXMLValue(tmp2, True))
220         
221            tmp['connectpoint'] = []
222 
223            for d in i.findall(util.nspath('SV_OperationMetadata/connectPoint', namespaces['srv'])):
224                tmp3 = d.find(util.nspath('CI_OnlineResource', namespaces['gmd']))
225                tmp['connectpoint'].append(CI_OnlineResource(tmp3))
226            self.operations.append(tmp)
227
228        self.operateson = []
229         
230        for i in md.findall(util.nspath('operatesOn', namespaces['srv'])):
231            tmp = {}
232            tmp['uuidref'] = i.attrib.get('uuidref')
233            tmp['href'] = i.attrib.get(util.nspath('href', namespaces['xlink']))
234            tmp['title'] = i.attrib.get(util.nspath('title', namespaces['xlink']))
235            self.operateson.append(tmp)
236
237class CI_OnlineResource(object):
238    """ process CI_OnlineResource """
239    def __init__(self,md):
240        val = md.find(util.nspath('linkage/URL', namespaces['gmd']))
241        self.url = util.testXMLValue(val)
242
243        val = md.find(util.nspath('protocol', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
244        self.protocol = util.testXMLValue(val)
245
246        val = md.find(util.nspath('name', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
247        self.name = util.testXMLValue(val)
248
249        val = md.find(util.nspath('description', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
250        self.description = util.testXMLValue(val)
251
252        val = md.find(util.nspath('function', namespaces['gmd']))
253        if val:
254            self.function = val.find(util.nspath('CI_OnLineFunctionCode', namespaces['gmd'])).attrib.get('codeListValue')
255        else:
256            self.function = None
257
258class EX_Extent(object):
259    """ process EX_Extent """
260    def __init__(self, md):
261        val = md.find(util.nspath('geographicElement/EX_GeographicBoundingBox/westBoundLongitude', namespaces['gmd']) + '/' + util.nspath('Decimal', namespaces['gco']))
262        self.minx = util.testXMLValue(val)
263        val = md.find(util.nspath('geographicElement/EX_GeographicBoundingBox/eastBoundLongitude', namespaces['gmd']) + '/' + util.nspath('Decimal', namespaces['gco']))
264        self.maxx = util.testXMLValue(val)
265        val = md.find(util.nspath('geographicElement/EX_GeographicBoundingBox/southBoundLatitude', namespaces['gmd']) + '/' + util.nspath('Decimal', namespaces['gco']))
266        self.miny = util.testXMLValue(val)
267        val = md.find(util.nspath('geographicElement/EX_GeographicBoundingBox/northBoundLatitude', namespaces['gmd']) + '/' + util.nspath('Decimal', namespaces['gco']))
268        self.maxy = util.testXMLValue(val)
269
270class MD_ReferenceSystem(object):
271    """ process MD_ReferenceSystem """
272    def __init__(self, md):
273        val = md.find(util.nspath('referenceSystemIdentifier/RS_Identifier/code', namespaces['gmd']) + '/' + util.nspath('CharacterString', namespaces['gco']))
274        self.code = util.testXMLValue(val)
275   
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
Note: See TracBrowser for help on using the browser.