def downloadMeta(self): """ Download BAG source file metadata from PDOK Atom feed URL. """ # Fetch and parse XML Atom file rsp = requests.get(self.atom_url) xml_str = rsp.content node = etree.fromstring(xml_str) node = stripNS(node) # Extract metadata self.extract_datum = node.xpath("//feed/entry/updated/text()")[0].split("T")[0] self.extract_fsize = long(node.xpath("//feed/entry/link/@length")[0]) self.extract_url = node.xpath("//feed/entry/link/@href")[0]
def downloadMeta(self): """ Download BAG source file metadata from PDOK Atom feed URL. """ # Fetch and parse XML Atom file rsp = requests.get(self.atom_url) xml_str = rsp.content node = etree.fromstring(xml_str) node = stripNS(node) # Extract metadata self.extract_datum = node.xpath("//feed/entry/updated/text()")[0].split('T')[0] self.extract_fsize = long(node.xpath("//feed/entry/link/@length")[0]) self.extract_url = node.xpath("//feed/entry/link/@href")[0]
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)
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)