def leesUitXML(self, xml): gmlNode = None # Attribuut vinden, bijv. bag_LVC:woonplaatsGeometrie xmlGeometrie = xml.find('./' + tagVolledigeNS(self._tag, xml.nsmap)) if xmlGeometrie is not None: # Probeer eerst een MultiSurface te vinden gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:MultiSurface", xml.nsmap)) if gmlNode is None: # Geen MultiSurface: probeer een Polygon te vinden gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:Polygon", xml.nsmap)) if gmlNode is not None: gmlStr = etree.tostring(gmlNode) polygon = ogr.CreateGeometryFromGML(str(gmlStr)) self._geometrie = ogr.Geometry(ogr.wkbMultiPolygon) self._geometrie.AddGeometryDirectly(polygon) else: # MultiSurface gmlStr = etree.tostring(gmlNode) self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr)) if self._geometrie is None: Log.log.warn("Null MultiSurface in BAGmultiPolygoon: tag=%s parent=%s" % (self._tag, self._parentObj.identificatie())) if self._geometrie is None: Log.log.warn("Null geometrie in BAGmultiPolygoon: tag=%s identificatie=%s" % (self._tag, self._parentObj.identificatie()))
def leesUitXML(self, xml): self.polygonAttr = None point = None try: xmlGeometrie = xml.find('./' + tagVolledigeNS(self._tag, xml.nsmap)) if xmlGeometrie is not None: gmlNode = xmlGeometrie.find( './' + tagVolledigeNS("gml:Point", xml.nsmap)) if gmlNode is not None: gmlStr = etree.tostring(gmlNode) self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr)) else: # Forceer punt uit Polygoon gmlNode = xmlGeometrie.find( './' + tagVolledigeNS("gml:Polygon", xml.nsmap)) if gmlNode is not None: gmlStr = etree.tostring(gmlNode) self._geometrie = ogr.CreateGeometryFromGML( str(gmlStr)) self._geometrie = self._geometrie.Centroid() except: Log.log.error( "ik kan hier echt geen POINT van maken: %s (en zet dit op 0,0,0)" % str(point.text))
def leesUitXML(self, xml): xmlGeometrie = xml.find('./' + tagVolledigeNS(self._tag, xml.nsmap)) if xmlGeometrie is not None: gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:Polygon", xmlGeometrie.nsmap)) if gmlNode is not None: gmlStr = etree.tostring(gmlNode) self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr))
def __call__(self): """Export self._map to WMC """ wmc_doc_tree = self._getRootElement() wmc_doc_tree.append(self._getGeneralElement()) wmc_doc_tree.append(self._getLayerListElement()) return etree.tostring(wmc_doc_tree)
def descend_one(t): """ descend into t's single child element. """ if len(t.getchildren()) != 1: print 'descend_one', etree.tostring(t) assert len(t.getchildren()) == 1, 'descend_one given %d children' % len(t.getchildren()) return t.getchildren()[0]
def write_gemeentelijke_indeling(args, gemeentelijke_indeling): if args.verbose: print("Building XML structure...") if gemeentelijke_indeling.has_key('nsmap'): root = etree.Element("gemeentelijke_indeling", nsmap=gemeentelijke_indeling['nsmap']) else: root = etree.Element("gemeentelijke_indeling") doc = etree.ElementTree(root) for attribute in gemeentelijke_indeling['attributes']: root.set(attribute, gemeentelijke_indeling['attributes'][attribute]) for jaar in sorted(gemeentelijke_indeling['indeling'], key=int): indeling = etree.Element("indeling") attributes = ['jaar'] for attribute in attributes: indeling.set(attribute, gemeentelijke_indeling['indeling'][jaar]['attributes'][attribute]) for provinciecode in sorted(gemeentelijke_indeling['indeling'][jaar]['provincie'], key=int): provincie = etree.Element("provincie") attributes = ['code', 'naam'] for attribute in attributes: provincie.set(attribute, gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['attributes'][attribute]) for gemeentecode in sorted(gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'], key=int): gemeente = etree.Element("gemeente") attributes = ['code', 'naam', 'begindatum', 'einddatum'] for attribute in attributes: if( gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'].has_key(attribute) and gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'][attribute] != None ): gemeente.set(attribute, gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'][attribute]) provincie.append(gemeente) indeling.append(provincie) root.append(indeling) if args.debug: if args.verbose: print("Not saving file: %s (DRY-RUN)" % args.output) print(etree.tostring(doc, pretty_print=True, xml_declaration=True, encoding='UTF-8')) else: if args.verbose: print("Saving file: %s" % args.output) doc.write(args.output, pretty_print=True, xml_declaration=True, encoding='UTF-8')
def leesUitXML(self, xml): self.polygonAttr = None point = None try: xmlGeometrie = xml.find('./' + tagVolledigeNS(self._tag, xml.nsmap)) if xmlGeometrie is not None: gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:Point", xml.nsmap)) if gmlNode is not None: gmlStr = etree.tostring(gmlNode) self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr)) else: # Forceer punt uit Polygoon gmlNode = xmlGeometrie.find('./' + tagVolledigeNS("gml:Polygon", xml.nsmap)) if gmlNode is not None: gmlStr = etree.tostring(gmlNode) self._geometrie = ogr.CreateGeometryFromGML(str(gmlStr)) self._geometrie = self._geometrie.Centroid() except: Log.log.error("ik kan hier echt geen POINT van maken: %s (en zet dit op 0,0,0)" % str(point.text))
def toxml(self): """Serialize into a WMS Service Exception XML """ preamble = '<?xml version="1.0" ?>' report_elem = etree.Element('ServiceExceptionReport') report_elem.attrib['version'] = '1.1.1' # Service Exception exception_elem = etree.Element('ServiceException') exception_elem.text = self.message report_elem.append(exception_elem) return preamble + etree.tostring(report_elem)
def write_gemeentelijke_indeling(args, gemeentelijke_indeling): if args.verbose: print("Building XML structure...") if 'nsmap' in gemeentelijke_indeling: root = etree.Element("gemeentelijke_indeling", nsmap=gemeentelijke_indeling['nsmap']) else: root = etree.Element("gemeentelijke_indeling") doc = etree.ElementTree(root) for attribute in gemeentelijke_indeling['attributes']: root.set(attribute, gemeentelijke_indeling['attributes'][attribute]) for jaar in sorted(gemeentelijke_indeling['indeling'], key=int): indeling = etree.Element("indeling") attributes = ['jaar'] for attribute in attributes: indeling.set(attribute, gemeentelijke_indeling['indeling'][jaar]['attributes'][attribute]) for provinciecode in sorted(gemeentelijke_indeling['indeling'][jaar]['provincie'], key=int): provincie = etree.Element("provincie") attributes = ['code', 'naam'] for attribute in attributes: provincie.set(attribute, gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['attributes'][attribute]) for gemeentecode in sorted(gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'], key=int): gemeente = etree.Element("gemeente") attributes = ['code', 'naam', 'begindatum', 'einddatum'] for attribute in attributes: if (attribute in gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'] and gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'][attribute] is not None): gemeente.set(attribute, gemeentelijke_indeling['indeling'][jaar]['provincie'][provinciecode]['gemeente'][gemeentecode]['attributes'][attribute]) provincie.append(gemeente) indeling.append(provincie) root.append(indeling) if args.dry_run: if args.verbose: print("Not saving file: %s (DRY-RUN)" % args.output) print(etree.tostring(doc, pretty_print=True, xml_declaration=True, encoding='UTF-8').decode()) else: if args.verbose: print("Saving file: %s" % args.output) doc.write(args.output, pretty_print=True, xml_declaration=True, encoding='UTF-8')
def parse(fn, out = None): """ Reads XML from the file name or object 'fn' and returns a 'Unit' instance. Rewrites the XML to out, if not None. """ e = etree.parse(fn).getroot() u = unit.Unit() u.lang = e.get('language') u.filename = e.get('filename') if out: open(out + os.path.basename(u.filename) + '.lh', 'w').write(etree.tostring(e)) u.source = e.find('raw-source').text for t in e.find('referenced-types').getchildren(): tt = types.aggregate_from_xml(t) assert tt.id not in u.types u.types[tt.id] = tt for f in e.find('function-bodies').getchildren(): u.functions += [ functions.Function.from_xml(f) ] u.finalise() return u
def getServiceXML(self): xml = None if self._capabilities is not None: xml = etree.tostring(self._capabilities) return xml
def processDOM(self, node, naam='onbekend'): self.bagObjecten = [] self.naam = naam mode = "Onbekend" doc_tag = stripschema(node.tag) # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012) if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC': mode = 'Nieuw' # firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "vraag": # TODO: Is het een idee om vraag als object ook af te # handelen en op te slaan vraag = child if doc_tag == 'BAG-GWR-Deelbestand-LVC': # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel # zodat we weten welke datum/versie is gebruikt... # Probeer BAG extract datum uit XML te vinden vraag = stripNS(vraag) gwr_datum = vraag.xpath("StandTechnischeDatum/text()") if len(gwr_datum) > 0: # Gevonden ! gwr_datum = str(gwr_datum[0]) else: gwr_datum = "onbekend" # Opslaan (evt vervangen) als meta info self.database.log_meta("gem_woonplaats_rel_datum", gwr_datum) elif stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate") for productnode in producten: product_tag = stripschema(productnode.tag) if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct': self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML(productnode) if product_tag == 'GemeenteWoonplaatsRelatieProduct': # Altijd de vorige weggooien self.database.log_actie('truncate_table', 'gemeente_woonplaats', 'altijd eerst leeg maken') self.database.tx_uitvoeren('truncate gemeente_woonplaats') bericht = Log.log.endTimer("objCreate - objs=" + str(len(self.bagObjecten))) self.database.log_actie('create_objects', self.naam, bericht) elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC': mode = 'Mutatie' # firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate (mutaties)") for productnode in producten: if stripschema(productnode.tag) == 'Mutatie-product': origineelObj = None # Gebruik als sorteersleutel (datum+volgnr) tbv volgorde verwerking verwerkings_id = '' for mutatienode in productnode: if stripschema(mutatienode.tag) == 'Verwerking': # Verkijgen verwerkings_datum en volgnummer tbv sorteren mutatienode = stripNS(mutatienode) # Maak uniek vewerkings id string uit datum-tijd + volgnr verwerkings_tijdstip = str(mutatienode.xpath("TijdstipVerwerking/text()")[0]) verwerkings_volgnr = str(mutatienode.xpath("VolgnrVerwerking/text()")[0]) verwerkings_id = verwerkings_tijdstip + '.' + verwerkings_volgnr # print('verwerkings_id=%s' % verwerkings_id) elif stripschema(mutatienode.tag) == 'Nieuw': # Log.log.info("Nieuw Object") bag_objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) for bag_obj in bag_objs: bag_obj.verwerkings_id = verwerkings_id self.bagObjecten.extend(bag_objs) elif stripschema(mutatienode.tag) == 'Origineel': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) if len(objs) > 0: origineelObj = objs[0] elif stripschema(mutatienode.tag) == 'Wijziging': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) if len(objs) > 0: nieuwObj = objs[0] if nieuwObj and origineelObj: nieuwObj.verwerkings_id = verwerkings_id nieuwObj.origineelObj = origineelObj self.bagObjecten.append(nieuwObj) # Log.log.info("Wijziging Object") origineelObj = None # Zie http://www.pythoncentral.io/how-to-sort-a-list-tuple-or-object-with-sorted-in-python # Tbv sorteren self.bagObjecten array op verwerkings volgorde def get_verwerkings_id(bag_obj): return bag_obj.verwerkings_id # Sorteer te muteren objecten op verwerkings_id self.bagObjecten = sorted(self.bagObjecten, key=get_verwerkings_id) bericht = Log.log.endTimer("objCreate (mutaties) - objs=" + str(len(self.bagObjecten))) Database().log_actie('create_objects', self.naam, bericht) elif doc_tag == 'BAG-Extract-Levering': # Meta data: info over levering # Sla hele file op self.database.log_meta("levering_xml", etree.tostring(node, pretty_print=True).decode()) # Extraheer BAG lever datum # <v202:LVC-Extract> # <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus> # <v202:productcode>DNLDLXAE02</v202:productcode> # <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum> # </v202:LVC-Extract> node = stripNS(node) # Probeer BAG extract datum uit XML te vinden extract_datum = node.xpath("//LVC-Extract/StandTechnischeDatum/text()") if len(extract_datum) > 0: # Gevonden ! extract_datum = str(extract_datum[0]) else: extract_datum = "onbekend" # Opslaan als meta info self.database.log_meta("extract_datum", extract_datum) Database().log_actie('verwerkt', self.naam, 'verwerken Leverings doc') else: bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag) Database().log_actie('n.v.t', self.naam, bericht) return Log.log.startTimer("dbStart mode = " + mode) # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT # maar moet nog gefinetuned if mode == 'Mutatie': # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen... bericht = self.dbStoreInsert(mode) else: bericht = self.dbStoreCopy(mode) Database().log_actie('insert_database', self.naam, bericht)
def processDOM(self, node): self.bagObjecten = [] mode = "Onbekend" doc_tag = stripschema(node.tag) # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012) if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC': mode = 'Nieuw' #firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "vraag": # TODO: Is het een idee om vraag als object ook af te # handelen en op te slaan vraag = child if doc_tag == 'BAG-GWR-Deelbestand-LVC': # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel # zodat we weten welke datum/versie is gebruikt... # Probeer BAG extract datum uit XML te vinden vraag = stripNS(vraag) gwr_datum = vraag.xpath( "StandTechnischeDatum/text()") if len(gwr_datum) > 0: # Gevonden ! gwr_datum = str(gwr_datum[0]) else: gwr_datum = "onbekend" # Opslaan (evt vervangen) als meta info self.database.log_meta( "gem_woonplaats_rel_datum", gwr_datum) elif stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate") for productnode in producten: product_tag = stripschema(productnode.tag) if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct': self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML( productnode) if product_tag == 'GemeenteWoonplaatsRelatieProduct': # Altijd de vorige weggooien Database().log_actie( 'truncate_table', 'gemeente_woonplaats', 'altijd eerst leeg maken') Database().tx_uitvoeren( 'truncate gemeente_woonplaats') bericht = Log.log.endTimer( "objCreate - objs=" + str(len(self.bagObjecten))) Database().log_actie('create_objects', 'idem', bericht) elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC': mode = 'Mutatie' #firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate (mutaties)") for productnode in producten: if stripschema( productnode.tag) == 'Mutatie-product': origineelObj = None nieuwObj = None for mutatienode in productnode: if stripschema( mutatienode.tag) == 'Nieuw': # Log.log.info("Nieuw Object") self.bagObjecten.extend( BAGObjectFabriek.bof. BAGObjectArrayBijXML( mutatienode)) elif stripschema(mutatienode.tag ) == 'Origineel': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML( mutatienode) if len(objs) > 0: origineelObj = objs[0] elif stripschema(mutatienode.tag ) == 'Wijziging': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML( mutatienode) if len(objs) > 0: nieuwObj = objs[0] if nieuwObj and origineelObj: nieuwObj.origineelObj = origineelObj self.bagObjecten.append( nieuwObj) # Log.log.info("Wijziging Object") origineelObj = None nieuwObj = None bericht = Log.log.endTimer( "objCreate (mutaties) - objs=" + str(len(self.bagObjecten))) Database().log_actie('create_objects', 'idem', bericht) elif doc_tag == 'BAG-Extract-Levering': # Meta data: info over levering # Sla hele file op self.database.log_meta("levering_xml", etree.tostring(node, pretty_print=True)) # Extraheer BAG lever datum # <v202:LVC-Extract> # <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus> # <v202:productcode>DNLDLXAE02</v202:productcode> # <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum> # </v202:LVC-Extract> node = stripNS(node) # Probeer BAG extract datum uit XML te vinden extract_datum = node.xpath( "//LVC-Extract/StandTechnischeDatum/text()") if len(extract_datum) > 0: # Gevonden ! extract_datum = str(extract_datum[0]) else: extract_datum = "onbekend" # Opslaan als meta info self.database.log_meta("extract_datum", extract_datum) else: bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag) Database().log_actie('n.v.t', 'n.v.t', bericht) return Log.log.startTimer("dbStart mode = " + mode) # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT # maar moet nog gefinetuned if mode == 'Mutatie': # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen... bericht = self.dbStoreInsert(mode) else: bericht = self.dbStoreCopy(mode) Database().log_actie('insert_database', 'idem', bericht)
def processDOM(self, node, naam='onbekend'): self.bagObjecten = [] self.naam = naam mode = "Onbekend" doc_tag = stripschema(node.tag) # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012) if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC': mode = 'Nieuw' #firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "vraag": # TODO: Is het een idee om vraag als object ook af te # handelen en op te slaan vraag = child if doc_tag == 'BAG-GWR-Deelbestand-LVC': # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel # zodat we weten welke datum/versie is gebruikt... # Probeer BAG extract datum uit XML te vinden vraag = stripNS(vraag) gwr_datum = vraag.xpath("StandTechnischeDatum/text()") if len(gwr_datum) > 0: # Gevonden ! gwr_datum = str(gwr_datum[0]) else: gwr_datum = "onbekend" # Opslaan (evt vervangen) als meta info self.database.log_meta("gem_woonplaats_rel_datum", gwr_datum) elif stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate") for productnode in producten: product_tag = stripschema(productnode.tag) if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct': self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML(productnode) if product_tag == 'GemeenteWoonplaatsRelatieProduct': # Altijd de vorige weggooien self.database.log_actie('truncate_table', 'gemeente_woonplaats', 'altijd eerst leeg maken') self.database.tx_uitvoeren('truncate gemeente_woonplaats') bericht = Log.log.endTimer("objCreate - objs=" + str(len(self.bagObjecten))) self.database.log_actie('create_objects', self.naam, bericht) elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC': mode = 'Mutatie' #firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate (mutaties)") for productnode in producten: if stripschema(productnode.tag) == 'Mutatie-product': origineelObj = None # Gebruik als sorteersleutel (datum+volgnr) tbv volgorde verwerking verwerkings_id = '' for mutatienode in productnode: if stripschema(mutatienode.tag) == 'Verwerking': # Verkijgen verwerkings_datum en volgnummer tbv sorteren mutatienode = stripNS(mutatienode) # Maak uniek vewerkings id string uit datum-tijd + volgnr verwerkings_tijdstip = str(mutatienode.xpath("TijdstipVerwerking/text()")[0]) verwerkings_volgnr = str(mutatienode.xpath("VolgnrVerwerking/text()")[0]) verwerkings_id = verwerkings_tijdstip + '.' + verwerkings_volgnr # print('verwerkings_id=%s' % verwerkings_id) elif stripschema(mutatienode.tag) == 'Nieuw': # Log.log.info("Nieuw Object") bag_objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) for bag_obj in bag_objs: bag_obj.verwerkings_id = verwerkings_id self.bagObjecten.extend(bag_objs) elif stripschema(mutatienode.tag) == 'Origineel': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) if len(objs) > 0: origineelObj = objs[0] elif stripschema(mutatienode.tag) == 'Wijziging': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) if len(objs) > 0: nieuwObj = objs[0] if nieuwObj and origineelObj: nieuwObj.verwerkings_id = verwerkings_id nieuwObj.origineelObj = origineelObj self.bagObjecten.append(nieuwObj) # Log.log.info("Wijziging Object") origineelObj = None # Zie http://www.pythoncentral.io/how-to-sort-a-list-tuple-or-object-with-sorted-in-python # Tbv sorteren self.bagObjecten array op verwerkings volgorde def get_verwerkings_id(bag_obj): return bag_obj.verwerkings_id # Sorteer te muteren objecten op verwerkings_id self.bagObjecten = sorted(self.bagObjecten, key=get_verwerkings_id) bericht = Log.log.endTimer("objCreate (mutaties) - objs=" + str(len(self.bagObjecten))) Database().log_actie('create_objects', self.naam, bericht) elif doc_tag == 'BAG-Extract-Levering': # Meta data: info over levering # Sla hele file op self.database.log_meta("levering_xml", etree.tostring(node, pretty_print=True)) # Extraheer BAG lever datum # <v202:LVC-Extract> # <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus> # <v202:productcode>DNLDLXAE02</v202:productcode> # <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum> # </v202:LVC-Extract> node = stripNS(node) # Probeer BAG extract datum uit XML te vinden extract_datum = node.xpath("//LVC-Extract/StandTechnischeDatum/text()") if len(extract_datum) > 0: # Gevonden ! extract_datum = str(extract_datum[0]) else: extract_datum = "onbekend" # Opslaan als meta info self.database.log_meta("extract_datum", extract_datum) Database().log_actie('verwerkt', self.naam, 'verwerken Leverings doc') else: bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag) Database().log_actie('n.v.t', self.naam, bericht) return Log.log.startTimer("dbStart mode = " + mode) # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT # maar moet nog gefinetuned if mode == 'Mutatie': # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen... bericht = self.dbStoreInsert(mode) else: bericht = self.dbStoreCopy(mode) Database().log_actie('insert_database', self.naam, bericht)
def processDOM(self, node): self.bagObjecten = [] mode = "Onbekend" doc_tag = stripschema(node.tag) # 'BAG-Extract-Deelbestand-LVC': standaard BAG Element, VBO etc # 'BAG-GWR-Deelbestand-LVC': Koppeltabel Gemeente-Woonplaats-Relatie (alleen in BAG na plm aug 2012) if doc_tag == 'BAG-Extract-Deelbestand-LVC' or doc_tag == 'BAG-GWR-Deelbestand-LVC': mode = 'Nieuw' #firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "vraag": # TODO: Is het een idee om vraag als object ook af te # handelen en op te slaan vraag = child if doc_tag == 'BAG-GWR-Deelbestand-LVC': # Noteer ook de standdatum van de gemeente_woonplaats koppel tabel # zodat we weten welke datum/versie is gebruikt... # Probeer BAG extract datum uit XML te vinden vraag = stripNS(vraag) gwr_datum = vraag.xpath("StandTechnischeDatum/text()") if len(gwr_datum) > 0: # Gevonden ! gwr_datum = str(gwr_datum[0]) else: gwr_datum = "onbekend" # Opslaan (evt vervangen) als meta info self.database.log_meta("gem_woonplaats_rel_datum", gwr_datum) elif stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate") for productnode in producten: product_tag = stripschema(productnode.tag) if product_tag == 'LVC-product' or product_tag == 'GemeenteWoonplaatsRelatieProduct': self.bagObjecten = BAGObjectFabriek.bof.BAGObjectArrayBijXML(productnode) if product_tag == 'GemeenteWoonplaatsRelatieProduct': # Altijd de vorige weggooien self.database.log_actie('truncate_table', 'gemeente_woonplaats', 'altijd eerst leeg maken') self.database.tx_uitvoeren('truncate gemeente_woonplaats') bericht = Log.log.endTimer("objCreate - objs=" + str(len(self.bagObjecten))) self.database.log_actie('create_objects', 'idem', bericht) elif doc_tag == 'BAG-Mutaties-Deelbestand-LVC': mode = 'Mutatie' #firstchild moet zijn 'antwoord' for childNode in node: if stripschema(childNode.tag) == 'antwoord': # Antwoord bevat twee childs: vraag en producten antwoord = childNode for child in antwoord: if stripschema(child.tag) == "producten": producten = child Log.log.startTimer("objCreate (mutaties)") for productnode in producten: if stripschema(productnode.tag) == 'Mutatie-product': origineelObj = None nieuwObj = None for mutatienode in productnode: if stripschema(mutatienode.tag) == 'Nieuw': # Log.log.info("Nieuw Object") self.bagObjecten.extend( BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode)) elif stripschema(mutatienode.tag) == 'Origineel': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) if len(objs) > 0: origineelObj = objs[0] elif stripschema(mutatienode.tag) == 'Wijziging': objs = BAGObjectFabriek.bof.BAGObjectArrayBijXML(mutatienode) if len(objs) > 0: nieuwObj = objs[0] if nieuwObj and origineelObj: nieuwObj.origineelObj = origineelObj self.bagObjecten.append(nieuwObj) # Log.log.info("Wijziging Object") origineelObj = None nieuwObj = None bericht = Log.log.endTimer("objCreate (mutaties) - objs=" + str(len(self.bagObjecten))) Database().log_actie('create_objects', 'idem', bericht) elif doc_tag == 'BAG-Extract-Levering': # Meta data: info over levering # Sla hele file op self.database.log_meta("levering_xml", etree.tostring(node, pretty_print=True)) # Extraheer BAG lever datum # <v202:LVC-Extract> # <v202:gegVarLevenscyclus>true</v202:gegVarLevenscyclus> # <v202:productcode>DNLDLXAE02</v202:productcode> # <v202:StandTechnischeDatum>20120308</v202:StandTechnischeDatum> # </v202:LVC-Extract> node = stripNS(node) # Probeer BAG extract datum uit XML te vinden extract_datum = node.xpath("//LVC-Extract/StandTechnischeDatum/text()") if len(extract_datum) > 0: # Gevonden ! extract_datum = str(extract_datum[0]) else: extract_datum = "onbekend" # Opslaan als meta info self.database.log_meta("extract_datum", extract_datum) else: bericht = Log.log.info("Niet-verwerkbare XML node: " + doc_tag) Database().log_actie('n.v.t', 'n.v.t', bericht) return Log.log.startTimer("dbStart mode = " + mode) # Experimenteel: dbStoreCopy() gebruikt COPY ipv INSERT # maar moet nog gefinetuned if mode == 'Mutatie': # Voor mutaties voorlopig nog even ouderwetse INSERT/UPDATE # Hier speelt performance ook niet zo'n rol als bij hele BAG inlezen... bericht = self.dbStoreInsert(mode) else: bericht = self.dbStoreCopy(mode) Database().log_actie('insert_database', 'idem', bericht)