Beispiel #1
0
    def parse(self):
        """Parse the site model XML content and generate
        :class:`nrml.model.SiteModel` objects.

        :returns:
            A iterable of :class:`nrml.model.SiteModel` objects.
        """
        if self.schema_validation:
            schema = etree.XMLSchema(etree.parse(nrml.nrml_schema_file()))
        else:
            schema = None
        tree = etree.iterparse(self.source, events=("start",), schema=schema)

        for _, element in tree:
            if element.tag == "{%s}site" % nrml.NAMESPACE:
                site = models.SiteModel()
                site.vs30 = float(element.get("vs30"))
                site.vs30_type = element.get("vs30Type").strip()
                site.z1pt0 = float(element.get("z1pt0"))
                site.z2pt5 = float(element.get("z2pt5"))
                lonlat = dict(lon=element.get("lon").strip(), lat=element.get("lat").strip())
                site.wkt = "POINT(%(lon)s %(lat)s)" % lonlat

                yield site

                # Now do some clean up to free memory.
                while element.getprevious() is not None:
                    # Delete previous sibling elements.
                    # We need to loop here in case there are comments in
                    # the input file which are considered siblings to
                    # source elements.
                    del element.getparent()[0]
Beispiel #2
0
    def parse(self):
        """Parse the source XML content and generate a source model in object
        form.

        :returns:
            :class:`nrml.models.SourceModel` instance.
        """
        src_model = models.SourceModel()

        if self.schema_validation:
            schema = etree.XMLSchema(etree.parse(nrml.nrml_schema_file()))
        else:
            schema = None
        tree = etree.iterparse(self.source, events=("start", "end"), schema=schema)

        for event, element in tree:
            # Find the <sourceModel> element and get the 'name' attr.
            if event == "start":
                if element.tag == self._SM_TAG:
                    src_model.name = element.get("name")
                    break
            else:
                # If we get to here, we didn't find the <sourceModel> element.
                raise ValueError("<sourceModel> element not found.")

        src_model.sources = self._source_gen(tree)

        return src_model
Beispiel #3
0
def validates_against_xml_schema(xml_instance_path,
                                 schema_path=nrml.nrml_schema_file()):
    """
    Check whether an XML file validates against an XML schema.
    """

    xml_doc = etree.parse(xml_instance_path)
    xmlschema = etree.XMLSchema(etree.parse(schema_path))
    return xmlschema.validate(xml_doc)
Beispiel #4
0
    def assert_is_valid(self):
        """
        Check the input file is valid according to the schema.
        """

        exposure = etree.parse(self._source)
        xmlschema = etree.XMLSchema(etree.parse(nrml.nrml_schema_file()))

        if not xmlschema.validate(exposure):
            raise ValueError("Exposure model is not valid.")
Beispiel #5
0
    def get_xmlschema(cls):
        """
        Create (if needed) and return ``etree.XMLSchema`` object
        for verifying nrml-files correctness.

        Once created schema object is cached in ``_xmlschema``
        class attribute.
        """
        if not cls._xmlschema:
            cls._xmlschema = etree.XMLSchema(file=nrml.nrml_schema_file())
        return cls._xmlschema
Beispiel #6
0
    def _parse(self):
        """
        Parse the document iteratively.
        """

        schema = etree.XMLSchema(etree.parse(nrml.nrml_schema_file()))

        for event, element in etree.iterparse(
            self._source, events=('start', 'end'), schema=schema):

            if event == 'start' and element.tag == \
               '%sexposureList' % NRML:
                # we need to get the exposureList id, description and
                # asset category.
                exp_id = element.get('%sid' % GML)
                self._current_meta['listID'] = str(exp_id)

                desc = element.find('%sdescription' % GML)
                if desc is not None:
                    self._current_meta['listDescription'] = str(desc.text)

                taxsrc = element.find('%staxonomySource' % NRML)
                if taxsrc is not None:
                    self._current_meta['taxonomySource'] = str(taxsrc.text)

                asset_category = str(element.get('assetCategory'))
                self._current_meta['assetCategory'] = asset_category

                # type and unit for area, contents cost, retrofitting cost
                # and structural cost.
                attrs = ("areaType", "areaUnit", "cocoType", "cocoUnit",
                         "recoType", "recoUnit", "stcoType", "stcoUnit")
                for attr_name in attrs:
                    attr_value = element.get(attr_name)
                    if attr_value is not None:
                        self._current_meta[attr_name] = attr_value

            elif event == 'end' and element.tag == '%sassetDefinition' % NRML:
                site_data = (_to_site(element), _to_occupancy(element),
                             self._to_site_attributes(element))
                del element
                yield site_data
Beispiel #7
0
    def parse(self):
        """
        Parse the source XML content and generate a rupture model in object
        form. The file must contain a single SimpleFaultRupture object or
        a single ComplexFaultRupture object.

        :returns:
            :class:`nrml.models.SimpleFaultRuptureModel` instance or
            :class:`nrml.models.ComplexFaultRuptureModel` instance
        """
        schema = etree.XMLSchema(etree.parse(nrml.nrml_schema_file()))
        tree = etree.iterparse(self.source, schema=schema)
        for _, element in tree:
            parse_fn = self._parse_fn_map.get(element.tag)
            if parse_fn:
                return parse_fn(element)
        # If we get to here, we didn't find the right element.
        raise ValueError('<%s> or <%s> element not found.'
                         % (self._SIMPLE_RUPT_TAG,
                            self._COMPLEX_RUPT_TAG))