resource-watch/prep-nexgddp

View on GitHub
nexgddp/services/xml_service.py

Summary

Maintainability
B
5 hrs
Test Coverage
F
55%
"""XML SERVICE"""

import logging
import xml.etree.ElementTree as ET

from nexgddp.errors import XMLParserError


class XMLService(object):
    """."""

    @staticmethod
    def get_fields(xml):
        logging.info('[XMLService] Parsing XML fields')
        fields = {}
        try:
            root = ET.fromstring(xml)
            for cd in root.findall('{http://www.opengis.net/wcs/2.0}CoverageDescription'):
                for rt in cd.findall('{http://www.opengis.net/gmlcov/1.0}rangeType'):
                    for dr in rt.findall('{http://www.opengis.net/swe/2.0}DataRecord'):
                        for field in dr.findall('{http://www.opengis.net/swe/2.0}field'):
                            field_name = field.get('name')
                            for field_spec in field.findall('{http://www.opengis.net/swe/2.0}Quantity'):
                                for field_spec_uom in field_spec.findall('{http://www.opengis.net/swe/2.0}uom'):
                                    fields[field_name] = {
                                        'type': 'number',
                                        'uom': field_spec_uom.get('code')
                                    }
            fields['year'] = {'type': 'date'}
        except Exception as e:
            raise XMLParserError(message=str(e))
        return fields

    @staticmethod
    def get_domain(xml):
        logging.info('[XMLService] Parsing XML domain info')
        domain = {}
        try:
            root = ET.fromstring(xml)
            for cd in root.findall('{http://www.opengis.net/wcs/2.0}CoverageDescription'):
                for bb in cd.findall('{http://www.opengis.net/gml/3.2}boundedBy'):
                    for envelope in bb:
                        for corner in envelope:
                            domain_tag = corner.tag.rsplit('}')[-1]
                            domain_attributes = corner.text.replace('"', '').rsplit(' ')
                            domain[domain_tag] = domain_attributes

        except Exception as e:
            raise XMLParserError(message=str(e))
        return domain