def get_inputs_from_xml(doc): the_inputs = {} for input_el in xpath_ns(doc, '/wps:Execute/wps:DataInputs/wps:Input'): [identifier_el] = xpath_ns(input_el, './ows:Identifier') identifier = identifier_el.text if identifier not in the_inputs: the_inputs[identifier] = [] literal_data = xpath_ns(input_el, './wps:Data/wps:LiteralData') if literal_data: value_el = literal_data[0] inpt = {} inpt['identifier'] = identifier_el.text inpt['data'] = text_type(value_el.text) inpt['uom'] = value_el.attrib.get('uom', '') inpt['datatype'] = value_el.attrib.get('datatype', '') the_inputs[identifier].append(inpt) continue complex_data = xpath_ns(input_el, './wps:Data/wps:ComplexData') if complex_data: complex_data_el = complex_data[0] inpt = {} inpt['identifier'] = identifier_el.text if len(complex_data_el.getchildren()) > 0: value_el = complex_data_el[0] inpt['data'] = _get_dataelement_value(value_el) else: inpt['data'] = _get_rawvalue_value(complex_data_el.text) inpt['mimeType'] = complex_data_el.attrib.get('mimeType', '') inpt['encoding'] = complex_data_el.attrib.get('encoding', '') inpt['schema'] = complex_data_el.attrib.get('schema', '') inpt['method'] = complex_data_el.attrib.get('method', 'GET') the_inputs[identifier].append(inpt) continue reference_data = xpath_ns(input_el, './wps:Reference') if reference_data: reference_data_el = reference_data[0] inpt = {} inpt['identifier'] = identifier_el.text inpt[identifier_el.text] = reference_data_el.text inpt['href'] = reference_data_el.attrib.get( '{http://www.w3.org/1999/xlink}href', '') inpt['mimeType'] = reference_data_el.attrib.get('mimeType', '') the_inputs[identifier].append(inpt) continue # OWSlib is not python 3 compatible yet if PY2: from owslib.ows import BoundingBox bbox_datas = xpath_ns(input_el, './wps:Data/wps:BoundingBoxData') if bbox_datas: for bbox_data in bbox_datas: bbox_data_el = bbox_data bbox = BoundingBox(bbox_data_el) the_inputs[identifier].append(bbox) return the_inputs
def test_ows_bbox(): bbox_elem = etree.fromstring(""" <ows:BoundingBox xmlns:ows="{}" crs="EPSG:4326" dimensions="2"> <ows:LowerCorner>0.0 -90.0</ows:LowerCorner> <ows:UpperCorner>180.0 90.0</ows:UpperCorner> </ows:BoundingBox>""".format(DEFAULT_OWS_NAMESPACE)) bbox = BoundingBox(bbox_elem) assert bbox.crs == crs.Crs('EPSG:4326') assert bbox.crs.axisorder == 'yx' assert bbox.dimensions == 2 assert bbox.minx == '-90.0' assert bbox.miny == '0.0' assert bbox.maxx == '90.0' assert bbox.maxy == '180.0'
def test_ows_bbox_with_namespaces(): """ XML bounding box description as received from a wps request """ bbox_elem = etree.fromstring(""" <wps:BoundingBoxData xmlns:wps="{}" xmlns:ows="{}" ows:crs="EPSG:4326" ows:dimensions="2"> <ows:LowerCorner>0.0 -90.0</ows:LowerCorner> <ows:UpperCorner>180.0 90.0</ows:UpperCorner> </wps:BoundingBoxData>""".format(DEFAULT_WPS_NAMESPACE, DEFAULT_OWS_NAMESPACE)) bbox = BoundingBox(bbox_elem) assert bbox.crs == crs.Crs('EPSG:4326') assert bbox.crs.axisorder == 'yx' assert bbox.dimensions == 2 assert bbox.minx == '-90.0' assert bbox.miny == '0.0' assert bbox.maxx == '90.0' assert bbox.maxy == '180.0'
def __init__(self, elem, parse_remote_metadata=False, timeout=30, headers=None, auth=None): """.""" super(ContentMetadata, self).__init__(headers=headers, auth=auth) self.id = testXMLValue(elem.find(nspath_eval("wfs:Name", namespaces))) self.title = testXMLValue( elem.find(nspath_eval("wfs:Title", namespaces))) self.abstract = testXMLValue( elem.find(nspath_eval("wfs:Abstract", namespaces))) self.keywords = [ f.text for f in elem.findall( nspath_eval("ows:Keywords/ows:Keyword", namespaces)) ] # bbox self.boundingBoxWGS84 = None b = BoundingBox( elem.find(nspath_eval("ows:WGS84BoundingBox", namespaces)), namespaces["ows"], ) if b is not None: try: self.boundingBoxWGS84 = ( float(b.minx), float(b.miny), float(b.maxx), float(b.maxy), ) except TypeError: self.boundingBoxWGS84 = None # crs options self.crsOptions = [ Crs(srs.text) for srs in elem.findall(nspath_eval("wfs:OtherSRS", namespaces)) ] dsrs = testXMLValue( elem.find(nspath_eval("wfs:DefaultSRS", namespaces))) if dsrs is not None: # first element is default srs self.crsOptions.insert(0, Crs(dsrs)) # verbs self.verbOptions = [ op.text for op in elem.findall( nspath_eval("wfs:Operations/wfs:Operation", namespaces)) ] # output formats self.outputFormats = [ op.text for op in elem.findall( nspath_eval("wfs:OutputFormats/wfs:Format", namespaces)) ] # MetadataURLs self.metadataUrls = [] for m in elem.findall(nspath_eval("wfs:MetadataURL", namespaces)): metadataUrl = { "type": testXMLValue(m.attrib["type"], attrib=True), "format": testXMLValue(m.attrib["format"], attrib=True), "url": testXMLValue(m), } self.metadataUrls.append(metadataUrl) if parse_remote_metadata: self.parse_remote_metadata(timeout) # others not used but needed for iContentMetadata harmonisation self.styles = None self.timepositions = None self.defaulttimeposition = None
def get_inputs_from_xml(doc): the_inputs = {} version = get_version_from_ns(doc.nsmap[doc.prefix]) xpath_ns = get_xpath_ns(version) for input_el in xpath_ns(doc, '/wps:Execute/wps:DataInputs/wps:Input'): [identifier_el] = xpath_ns(input_el, './ows:Identifier') identifier = identifier_el.text if identifier not in the_inputs: the_inputs[identifier] = [] literal_data = xpath_ns(input_el, './wps:Data/wps:LiteralData') if literal_data: value_el = literal_data[0] inpt = {} inpt['identifier'] = identifier_el.text inpt['data'] = text_type(value_el.text) inpt['uom'] = value_el.attrib.get('uom', '') inpt['datatype'] = value_el.attrib.get('datatype', '') the_inputs[identifier].append(inpt) continue complex_data = xpath_ns(input_el, './wps:Data/wps:ComplexData') if complex_data: complex_data_el = complex_data[0] inpt = {} inpt['identifier'] = identifier_el.text inpt['mimeType'] = complex_data_el.attrib.get('mimeType', '') inpt['encoding'] = complex_data_el.attrib.get('encoding', '').lower() inpt['schema'] = complex_data_el.attrib.get('schema', '') inpt['method'] = complex_data_el.attrib.get('method', 'GET') if len(complex_data_el.getchildren()) > 0: value_el = complex_data_el[0] inpt['data'] = _get_dataelement_value(value_el) else: inpt['data'] = _get_rawvalue_value(complex_data_el.text, inpt['encoding']) the_inputs[identifier].append(inpt) continue reference_data = xpath_ns(input_el, './wps:Reference') if reference_data: reference_data_el = reference_data[0] inpt = {} inpt['identifier'] = identifier_el.text inpt[identifier_el.text] = reference_data_el.text inpt['href'] = reference_data_el.attrib.get( '{http://www.w3.org/1999/xlink}href', '') inpt['mimeType'] = reference_data_el.attrib.get('mimeType', '') inpt['method'] = reference_data_el.attrib.get('method', 'GET') header_element = xpath_ns(reference_data_el, './wps:Header') if header_element: inpt['header'] = _get_reference_header(header_element) body_element = xpath_ns(reference_data_el, './wps:Body') if body_element: inpt['body'] = _get_reference_body(body_element[0]) bodyreference_element = xpath_ns(reference_data_el, './wps:BodyReference') if bodyreference_element: inpt['bodyreference'] = _get_reference_bodyreference( bodyreference_element[0]) the_inputs[identifier].append(inpt) continue # Using OWSlib BoundingBox from owslib.ows import BoundingBox bbox_datas = xpath_ns(input_el, './wps:Data/wps:BoundingBoxData') if bbox_datas: for bbox_data in bbox_datas: bbox_data_el = bbox_data bbox = BoundingBox(bbox_data_el) the_inputs[identifier].append(bbox) LOGGER.debug("parse bbox: {},{},{},{}".format( bbox.minx, bbox.miny, bbox.maxx, bbox.maxy)) return the_inputs