Problem mit Programm XML Parser

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

Bin am verzweifeln. Ich hab meinen XML Parser ausgebaut. Leider passiert gar nichts. Ich starte und der beendet sich direkt wieder ohne Fehler.

Code: Alles auswählen

import string
import codecs
import sys
from xml.etree import ElementTree as et

def parser(flag):
	if flag == "u":
	    text = message.find("VUser").text
	elif flag == "a":
	    text = message.find("Agent").text
	elif flag == "m":
	    text = message.find("Text").text
	#elif flag == "p":
	    #text = message.find("").text
	elif flag == "t":
	    text = message.find("Transaction").text
	elif flag == "s":
	    text = message.find("Script").text
	else:
	    print "Parameter nicht vorhanden"
	    sys.exit()
	    
	yield text


def main():
  try:
      argument1 = sys.argv[1]
  except IndexError:
      argument1="hilfe"
  try:
      argument2 = sys.argv[2]
  except IndexError:
      argument2 = "leer"
  try:
      argument3 = sys.argv[3]
  except IndexError:
      argument3 = "leer"
  if "line" not in argument1:
      argument1="hilfe"
  argument1 = argument1.lower()
  if "hilfe" in argument1:
      print "Das ist die Hilfe"
      print "Bitte Porgramm mit den entsprechenden Parameter Aufrufen"
      print "Mit dem Parameter 'line:' und danach mit den Argumenten pro Zeile"
      print "Datum und Zeit werden immer mit angeben"
      print "u  User"
      print "a  Agent"
      print "m Message"
      print "p  Profile"
      print "t  Transporter"
      print "s  Sicher"
      print "Beispiel XMLparserdeluxe.py line:a"
      sys.exit()

  files = file("detailedReport.xml", "r")
  etree = et.parse(files)
  files.close()
  out_file = codecs.open("detailedReport.csv", "w", "utf-8")
  root_tag = etree.getroot()
  for messagelist in root_tag.findall("MessageList"):
      for message in messagelist.findall("Message"):
          time = message.find("Time").text 
          time = time.replace(" ",";")

          if argument3 is not "leer":
              argument3 = argument3.lower()
              argument3 = argument3.strip("line:")
              text = parser(argument3)
              text = text.strip()
              out_file.write("%s;%s;1" % (time, text) + "\r\n")

          if argument2 is not "leer":
              argument2 = argument2.lower()
              argument2 = argument2.strip("line:")
              text = parser(argument2)
              text = text.strip()
              out_file.write("%s;%s;1" % (time, text) + "\r\n")

          argument1 = argument1.lower()
          argument1 = argument1.strip("line:")
          text = parser(argument1)
          text = text.strip()      
          out_file.write("%s;%s;1" % (time, text) + "\r\n")
  out_file.close()
Weiß nicht wo der Fehler sein könnte.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Ich würde was fertiges nehmen. Ich nutze BeautifulSoup, für HTML Seiten, zum parsen. Glaube das kann auch locker XML.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

du musst deine Funktion main() natürlich auch aufrufen, sonst passiert gar nichts.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

The Hit-Man hat geschrieben:Ich würde was fertiges nehmen. Ich nutze BeautifulSoup, für HTML Seiten, zum parsen. Glaube das kann auch locker XML.
Und ElementTree ist nicht ein vollwertiger XML-Parser? Die Empfehlung ist zudem seltsam, da BeautifulSoup eben kein XML-Parser ist sondern ein HTML-Scaper.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

ja manchmal steh ich echt auf dem Schlauch. Der XML Parser ist ja eine erweiterung von dem Programm was ich vorher geschrieben hatte und ElementTree ist sehr gut.
madthomas hat geschrieben:

Code: Alles auswählen

import string
import codecs
import sys
from xml.etree import ElementTree as et

def parser(flag):
	if flag == "u":
	    text = message.find("VUser").text
	elif flag == "a":
	    text = message.find("Agent").text
	elif flag == "m":
	    text = message.find("Text").text
	#elif flag == "p":
	    #text = message.find("").text
	elif flag == "t":
	    text = message.find("Transaction").text
	elif flag == "s":
	    text = message.find("Script").text
	else:
	    print "Parameter nicht vorhanden"
	    sys.exit()
	    
	yield text


def main():
  try:
      argument1 = sys.argv[1]
  except IndexError:
      argument1="hilfe"
  try:
      argument2 = sys.argv[2]
  except IndexError:
      argument2 = "leer"
  try:
      argument3 = sys.argv[3]
  except IndexError:
      argument3 = "leer"
  if "line" not in argument1:
      argument1="hilfe"
  argument1 = argument1.lower()
  if "hilfe" in argument1:
      print "Das ist die Hilfe"
      print "Bitte Porgramm mit den entsprechenden Parameter Aufrufen"
      print "Mit dem Parameter 'line:' und danach mit den Argumenten pro Zeile"
      print "Datum und Zeit werden immer mit angeben"
      print "u  User"
      print "a  Agent"
      print "m Message"
      print "p  Profile"
      print "t  Transporter"
      print "s  Sicher"
      print "Beispiel XMLparserdeluxe.py line:a"
      sys.exit()

  files = file("detailedReport.xml", "r")
  etree = et.parse(files)
  files.close()
  out_file = codecs.open("detailedReport.csv", "w", "utf-8")
  root_tag = etree.getroot()
  for messagelist in root_tag.findall("MessageList"):
      for message in messagelist.findall("Message"):
          time = message.find("Time").text 
          time = time.replace(" ",";")

          if argument3 is not "leer":
              argument3 = argument3.lower()
              argument3 = argument3.strip("line:")
              text = parser(argument3)
              text = text.strip()
              out_file.write("%s;%s;1" % (time, text) + "\r\n")

          if argument2 is not "leer":
              argument2 = argument2.lower()
              argument2 = argument2.strip("line:")
              text = parser(argument2)
              text = text.strip()
              out_file.write("%s;%s;1" % (time, text) + "\r\n")

          argument1 = argument1.lower()
          argument1 = argument1.strip("line:")
          text = parser(argument1)
          text = text.strip()      
          out_file.write("%s;%s;1" % (time, text) + "\r\n")
  out_file.close()

main()
Mein Problem ist jetzt das er mir jetzt sowas ausgibt. Sieht mir nach der Speicheradresse aus.
26.06.2008;13:25:49;<generator object at 0x039AE9E0>;1
26.06.2008;13:30:21;<generator object at 0x039AEA08>;1

Das Generator Object wiederholt sich
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Du bekommst Generatoren zurück (das kannst du dir wie Listen vorstellen, deren Inhalt erst berechnet wird, wenn man reinschaut - wie Schrödingers Katze etwa), deren String-Darstellung du in die Textdatei speicherst. Du musst den Generator durchiterieren und die Ergebnisse rausholen (``for item in your_generator: ...``).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Oder vielleicht den Quatsch mit der Generatorfunktion einfach sein lassen. Eine Generatorfunktion die grundsätzlich nur einen Wert liefert ist relativ sinnlos.

Ansonsten kann man die `parse()`-Funktion mit einem Dictionary das Flags auf die zu suchenden Texte abbildet von den ganzen ``elif``\s befreien.

Das eine Funktion im Fehlerfall das ganze Programm abbricht ist ungünstig, da schlecht wiederverwendbar.

Die durchnummerierten Argumentnamen und deren weitere Behandlung im Programm ist sehr unschön. Warum lässt Du die nicht in einer Liste und verarbeitest sie in einer Schleife. Dann kann man sich auch sparen Argumente durch die Zuweisung der Zeichenkette "leer" als nicht existent zu kennzeichnen.
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

@Leonidas

Ich benutze BeautifulSoup auch für XML. Lesen und schreiben von congif Files.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

@madthomas: Als kleiner Tipp am Rande: Benutze doch optparse für das Parsen Deiner Kommandozeilenparameter!
http://docs.python.org/lib/module-optparse.html

Spart viel Code und bietet viel Sicherheit :-)
lunar

The Hit-Man hat geschrieben:@Leonidas

Ich benutze BeautifulSoup auch für XML. Lesen und schreiben von congif Files.
Frei nach dem Motto, "es gibt nichts, was man nicht missbrauchen kann"?
The Hit-Man
User
Beiträge: 435
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Da ich wxWidgets nutze, habe ich auch schon daran gedacht, config Files mit wxWidgets zu verarbeiten.
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

so meint Skript wurde jetzt angepasst und verbessert.
Jetzt hab ich noch ein kleines Problem.

Ich lese ja aus dem XML Tags die Daten aus
<Agent>JamesBond</Agent>

Jetzt meine Frage kann ich auch Informationen aus dem Tag auslesen?
z.B.
in dem Tag Message befindet sich z.b.
<Agent>JamesBond</Agent>
<Profil bla bal bal =Agent007></profil>
Würd ich jetzt gerne Agent007 raus haben
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Mit etwas probieren im Interpreter wärst du sicher auch drauf gekommen:

Code: Alles auswählen

root = ET.fromstring("""<Message><Agent>JamesBond</Agent>
<Profil bal="Agent007"></Profil></Message>""")
p = root.find('Profile')
print p.attrib['bal']
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten