- ich bin noch Änfänger (das ändert sich hoffentlich mit er Zeit)
- ich möchte aus einer XML-datei (hier Dummydaten) die Koordinaten con bestimmten Haustypen herauslesen und woanders verwenden.
XML - Dummy:
Code: Alles auswählen
<?xml version="1.0" encoding="ISO-8859-1" standalone="no"?>
<?xml-stylesheet type="text/xsl" href="Beispieldummy.xsl"?>
<DATA xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Typ B.xsd">
<Holzhaus>
<besitzername>Lehmann</besitzername>
<dmy>125</dmy>
<Haus>
<Bezeichnung>Haus_1</Bezeichnung>
<Fenster>10</Fenster>
<Eingang>
<ebz>Nordseite</ebz>
<ebzrechts>2526297,873</ebzrechts>
<ebzhoch>5631284,145</ebzhoch>
</Eingang>
<Eingang>
<ebz>Suedseite</ebz>
<ebzrechts>2526297,813</ebzrechts>
<ebzhoch>5631284,126</ebzhoch>
</Eingang>
</Haus>
</Holzhaus>
<Steinhaus>
<besitzername>Schmidt</besitzername>
<dmy>19b</dmy>
<Haus>
<Bezeichnung>Haus_25</Bezeichnung>
<Fenster>6</Fenster>
<Eingang>
<ebz>Nordseite</ebz>
<ebzrechts>2526227,418</ebzrechts>
<ebzhoch>5631274,965</ebzhoch>
</Eingang>
<Eingang>
</Eingang>
<Eingang>
</Eingang>
</Haus>
</Steinhaus>
</DATA>
Es gibt Holzhäuser, die immer zwei Eingänge haben und Steinhäuser, die mindestens einen aber auch mehrere Eingänge haben können.
Ich brauche die Koordinaten (ebzrechts und ebzhoch) der Holzhäuser.
Code bislang:
Code: Alles auswählen
import sys
from xml.sax import make_parser, handler
import xml.sax as sax
class HausSaxHandler(handler.ContentHandler):
def __init__(self):
self.active = "" # aktuelles Tag
self.p1ebz = ""
self.p1ebzrechts = ""
self.p1ebzhoch = ""
self.p2ebz = ""
self.p2ebzrechts = ""
self.p2ebzhoch = ""
self.m = "" # Variable fuer eingang eins oder zwei
self.parentNode = ""
def startElement(self, name, attrs):
self.active = name
if name == "Holzhaus":
self.active = ""
self.parentNode = "holzhaus"
if name == "Eingang" and self.parentNode == "Holzhaus":
self.active = ""
self.p1ebz = "" # Name Eingang 1
self.p1ebzrechts = "" # Hochwert Eingang 1
self.p1ebzhoch = "" # Rechtswert Eingang 1
self.p2ebz = "" # Name Eingang 2
self.p2ebzrechts = "" # Hochwert Eingang 2
self.p2ebzhoch = "" # Hochwert Engang 2
def endElement(self, name):
if self.parentNode == "holzhaus":
if name == "Eingang" and self.m%2 == 0:
self.m +=1
print "anfang Punkt1 "
print self.besitzername
print self.p1ebzrechts
print self.p1ebzhoch
print "Ende Punkt1 \n"
elif name == "Eingang" and self.m%2 == 1:
self.m +=1
print "anfang Punkt 2 "
print self.p2ebzrechts
print self.p2ebzhoch
print "ende Punkt 2 \n"
def characters(self, content):
if self.active == "ebz" and self.m%2 == 0:
self.p1ebz += content
elif self.active == "ebzrechts" and self.m%2 == 0:
self.p1ebzrechts += content
elif self.active == "ebzhoch" and self.m%2 == 0:
self.p1ebzhoch += content
elif self.active == "ebz" and self.m%2 == 1:
self.p2ebz += content
elif self.active == "ebzrechts" and self.m%2 == 1:
self.p2ebzrechts += content
elif self.active == "ebzhoch" and self.m%2 == 1:
self.p2ebzhoch += content
parser = make_parser()
parser.setContentHandler(HausSaxHandler())
parser.parse(open('g:/dummy.xml', 'r'))
zum Code: ich habe mich sax entschieden, da meine xml-vorlage (wegen Datenschutz nicht gezeigt) schon aus 84.000 zeilen bei ca. 20Mio Zeichen besteht.
Der Gedanke ist, mit einer if-Abfrage die entsprechenden einträge auszuwählen.
Es gibt bestimmt eine schönere Möglichkeit das zu implementieren und dann auch zum gewünschten Ergebnis zu kommen.
Verzichte ich auf die
Code: Alles auswählen
if name == "Holzhaus":
Momentan entscheide ich per modulo, ob es sich um Eingang eins oder zwei des Holzhauses handelt, und packe die in unterschieliche Variablen. Hier müssen verschiedene Variablen verwendet vverden, da zwichen den beiden Pubkte irgendwann mal eine Line gezeichnet werden soll (Das gehört aber nicht hierzu, es geht nur um die "Extraktion der Tags")
Steinhäuser sollen erstmal unberücksichtig bleiben.
wie kann ich dem parser denn mitteilen, dass er den TagInhalt der koordinaten nur dann ausliest, wenn es sich um ein "holzhaus" handelt.
Ich freue mich über ernstahfte Antworten und weiß, dass das mit eigener Arbeit verbunden ist.
Schon mal vielen Dank
Gruß,
Anton