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.
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

Problem mit Programm XML Parser

Beitragvon madthomas » Freitag 25. Juli 2008, 08:37

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: 407
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Beitragvon The Hit-Man » Freitag 25. Juli 2008, 10:26

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

Beitragvon audax » Freitag 25. Juli 2008, 10:45

du musst deine Funktion main() natürlich auch aufrufen, sonst passiert gar nichts.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 25. Juli 2008, 11:54

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 Modvoice
madthomas
User
Beiträge: 35
Registriert: Dienstag 7. August 2007, 10:32
Wohnort: WND
Kontaktdaten:

Re: Problem mit Programm XML Parser

Beitragvon madthomas » Freitag 25. Juli 2008, 13:35

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 25. Juli 2008, 14:10

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 Modvoice
BlackJack

Beitragvon BlackJack » Freitag 25. Juli 2008, 17:02

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: 407
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Beitragvon The Hit-Man » Sonntag 27. Juli 2008, 06:27

@Leonidas

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

Beitragvon Hyperion » Montag 28. Juli 2008, 09:40

@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

Beitragvon lunar » Montag 28. Juli 2008, 10:22

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: 407
Registriert: Montag 20. Februar 2006, 18:11
Wohnort: Menden / Sauerland
Kontaktdaten:

Beitragvon The Hit-Man » Montag 28. Juli 2008, 12:31

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:

Beitragvon madthomas » Dienstag 29. Juli 2008, 09:49

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
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 29. Juli 2008, 09:59

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder