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]
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
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)
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.")
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
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
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))