Seite 1 von 1

Problem mit Programm XML Parser

Verfasst: Freitag 25. Juli 2008, 08:37
von madthomas
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.

Verfasst: Freitag 25. Juli 2008, 10:26
von The Hit-Man
Ich würde was fertiges nehmen. Ich nutze BeautifulSoup, für HTML Seiten, zum parsen. Glaube das kann auch locker XML.

Verfasst: Freitag 25. Juli 2008, 10:45
von audax
du musst deine Funktion main() natürlich auch aufrufen, sonst passiert gar nichts.

Verfasst: Freitag 25. Juli 2008, 11:54
von Leonidas
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.

Re: Problem mit Programm XML Parser

Verfasst: Freitag 25. Juli 2008, 13:35
von madthomas
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

Verfasst: Freitag 25. Juli 2008, 14:10
von Leonidas
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: ...``).

Verfasst: Freitag 25. Juli 2008, 17:02
von 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.

Verfasst: Sonntag 27. Juli 2008, 06:27
von The Hit-Man
@Leonidas

Ich benutze BeautifulSoup auch für XML. Lesen und schreiben von congif Files.

Verfasst: Montag 28. Juli 2008, 09:40
von Hyperion
@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 :-)

Verfasst: Montag 28. Juli 2008, 10:22
von 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"?

Verfasst: Montag 28. Juli 2008, 12:31
von The Hit-Man
Da ich wxWidgets nutze, habe ich auch schon daran gedacht, config Files mit wxWidgets zu verarbeiten.

Verfasst: Dienstag 29. Juli 2008, 09:49
von madthomas
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

Verfasst: Dienstag 29. Juli 2008, 09:59
von Leonidas
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']