XML-Parser will nicht parsen

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
studi
User
Beiträge: 25
Registriert: Montag 2. Juni 2008, 22:59

Hallo.
Ich meine zwar mein Problem liegt eher am XMLRPC-Modul, aber da ich die erhaltene XML-Nachricht jetzt auslesen (parsen?) will schreibe ich mal hier rein.
Mein XMLRPC-Server:

Code: Alles auswählen

from SimpleXMLRPCServer import SimpleXMLRPCServer
from threading import Thread
import socket
socket.setdefaulttimeout(3) # Timeout auf 3 sec. setzen
import xmlrpclib
import sys, os, time
import xml_parse
#import create_xml

class XmlrpcHandler:
    def mod_1 (self, xml_message_1):
        # XML lesen und eine Adresse ('http//IP:Port') konstruieren
        data = open ('message_1.xml', 'w')
        data.write (xml_message_1)
        data.close()
        ip = xml_parse.xml_read(xml_message_1)
        print ip
        print xml_message_1
        return xml_message_1


server = SimpleXMLRPCServer(("0.0.0.0", 50505), allow_none=True)
server.register_instance(XmlrpcHandler())
print "Der XMLRPC-Server horcht auf http://0.0.0.0:50505."
print "Er kann mit STRG+C beendet werden."
server.serve_forever()
bekommt diese XML:

<?xml version="1.0" encoding="iso-8859-1" ?>
- <reg_publish_message>
- <message_mod_1>
<modul1_ip>131.188.113.139</modul1_ip>
<modul1_port>8889</modul1_port>
<modul1_name>schrauber</modul1_name>
<modul1_need>torque</modul1_need>
<modul1_give>force</modul1_give>
</message_mod_1>
</reg_publish_message>

Beim versuch das Modul xml_parse.xml_read(xml_message_1) mit der Nachricht aufzurufen meldet er mir folgendes:

Traceback (most recent call last):
File "modul_1.py", line 47, in <module>
st.modul_1()
File "modul_1.py", line 34, in modul_1
server.mod_1(xml_message)
File "C:\Programme\Python25\lib\xmlrpclib.py", line 1147, in __call__
return self.__send(self.__name, args)
File "C:\Programme\Python25\lib\xmlrpclib.py", line 1437, in __request
verbose=self.__verbose
File "C:\Programme\Python25\lib\xmlrpclib.py", line 1201, in request
return self._parse_response(h.getfile(), sock)
File "C:\Programme\Python25\lib\xmlrpclib.py", line 1340, in _parse_response
return u.close()
File "C:\Programme\Python25\lib\xmlrpclib.py", line 787, in close
raise Fault(**self._stack[0])
xmlrpclib.Fault: <Fault 1: '<type \'exceptions.IOError\'>:[Errno 2] No such file or directory: \'<?xml version="1.0" encoding="iso-8859-1"?>\\n<reg_publish_message>\\.

Die Funktion xml_read(data) funktioniert wenn man die XML direkt übergibt, bloss will der RPC nicht.

Ich weiß nicht mehr weiter, wäre schön wenn jemand mir helfen könnte.
Vielen dank. :)
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich habe mal den Thread geteilt. Ist ja schließlich ein neues Problem.

Wo kommt denn ``xml_parser`` her? So wie es aussieht, übergibst du einer Funktion die einen Dateinamen erwartet, XML was dann für den Dateinamen gehalten wird.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

@studi: Wo kommt diese Neigung her überall eine `_1` anzuhängen!?

Das gilt insbesondere für die Einsen in den Tagnamen beim XML. Falls der Entwurf von Dir ist, solltest Du den ändern und die Nummer z.B. in ein Attribut stecken. In Namen haben solche veränderlichen Informationen nichts zu suchen. Früher oder später fängt man sonst nämlich an Tagnamen mit regulären Ausdrücken auseinander zu nehmen, um die Information da umständlich wieder heraus zu holen. Und ein DTD/Schema lässt sich für XML mit solchen Tags auch nicht schreiben.

Warum speicherst Du die XML-Daten in eine Datei? Das führt zu Chaos wenn `mod_1` mehr als einmal "gleichzeitig" aufgerufen werden kann und die Aufrufe sich dann gegenseitig die gleiche Datei überschreiben.

Und wie's jetzt aussieht gibt der RPC-Aufruf die gleichen Daten, die er bekommen hat, wieder an den Aufrufer zurück. Da würde vielleicht ein einfaches `True` ausreichen.

Die beiden '-' sind in den XML-Daten hoffentlich nicht an der Stelle!? Dann wär's kein gültiges XML.
studi
User
Beiträge: 25
Registriert: Montag 2. Juni 2008, 22:59

Wo kommt denn ``xml_parser`` her?
Das ist das Modul mit dem ich versuche zu parsen:

Code: Alles auswählen

from xml.etree import ElementTree as etree

def xml_read (xml_data):


    tree = etree.parse(xml_data) # einlesen der XML-Datei
    root = tree.getroot() # Bestimmung des Wurzelelements
    for message in root.findall('message_mod_1'):
        modul_ip = message.find('modul1_ip').text

    print modul_ip
    return modul_ip
Eigentlich wird ja nur eine Datei aus Strings erwartet, was ich ja auch übergebe. :?
Wo kommt diese Neigung her überall eine `_1` anzuhängen!? Das gilt insbesondere für die Einsen in den Tagnamen beim XML.
Ja das werde ich machen, da es mehrere XML's gigt mit gleicher Struktur aber unterschiedlichen Werten müssen die unterschieden werden. Du hast recht mit einem Atribut wird es einfacher diese unterscheidung festzustellen.
Warum speicherst Du die XML-Daten in eine Datei?
Das habe ich nut zum Test gemacht um xml_read (xml_data) zu testen.
Und wie's jetzt aussieht gibt der RPC-Aufruf die gleichen Daten, die er bekommen hat, wieder an den Aufrufer zurück.
Das Modul in dem die Funktion xml_read (xml_data) ist hat mit dem Aufrufer nicht zu tun, außer das beide zur Zeit im gleichen Verzeichnis abgespeichert sind. Später müssen sie auf zwei verschiedene Rechner. Kann der Handler keine Funktion aufrufen, soll ich diesen aufruf außerhalb der Handler-Funktion machen? Ich versuchsmal und sage bescheid.
Die beiden '-' sind in den XML-Daten hoffentlich nicht an der Stelle!?
Doch die sind da, ich weiß auch gar nicht wie ich die wegbekomme, ich mache die XML aus einer verschachtelten Liste. Warum die da auftauchen habe ich echt keine ahnung. :?
Freue mich auf eure Hilfe. Danke. :)
BlackJack

Du übergibst keine Datei mit den Daten, sondern die Daten selbst, an einer Stelle wo der Dateiname erwartet wird. Die Fehlermeldung ist doch eigentlich schon ziemlich deutlich.

In der `xml_read()` ermittelst Du in der ``for``-Schleife nur die "modul1_ip" der letzten "message_mod_1". Mal abgesehen davon, dass man das auch ohne Schleife machen kann, indem man einfach auf das letzte Element der Liste zugreift: Ist das so gewollt?

Wie gesagt, die '-' gehören da nicht hin. Das lässt sich so nicht als XML parsen.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

studi hat geschrieben:
Wo kommt denn ``xml_parser`` her?
Das ist das Modul mit dem ich versuche zu parsen:

Code: Alles auswählen

from xml.etree import ElementTree as etree

def xml_read (xml_data):


    tree = etree.parse(xml_data) # einlesen der XML-Datei
    root = tree.getroot() # Bestimmung des Wurzelelements
    for message in root.findall('message_mod_1'):
        modul_ip = message.find('modul1_ip').text

    print modul_ip
    return modul_ip
Eigentlich wird ja nur eine Datei aus Strings erwartet, was ich ja auch übergebe. :?
Nein. ``ElementTree.parse`` erwartet entweder einen Dateinamen oder ein ``file``-Objekt. Was du suchst ist ``ElementTree.fromstring``.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
studi
User
Beiträge: 25
Registriert: Montag 2. Juni 2008, 22:59

Danke Leonidas "ElementTree.fromstring" maht's wunderbar. Genau danach hebe ich auch gesucht. :D In der Doku habe ich nichts derartiges gesehen, hm :? .
BlackJack

Gibt es eigentlich einen guten Grund warum Du die Daten erst in XML verpackst, das zum Server schickst, um sie dann da wieder aus dem XML aus zu lesen!? Ich meine anstatt die Daten ohne den Umweg über XML zu schicken.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

studi hat geschrieben:In der Doku habe ich nichts derartiges gesehen, hm :? .
Auch nicht hier? Naja, ist ja jetzt auch egal.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten