Lösungsansatz für Code aus XML generieren gesucht

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
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

Hallo,

wie der Titel sagt, suche ich nach einen Weg wie ich aus einer XML Datei Code generieren kann.
Die XML Datei enthält die Beschreibung des Datenlayout den ich verarbeiten muss. Also zum Beispiel

Code: Alles auswählen

<Mx_Msg>
    <M1 id= "1">
        <field name="Mx14_02" id="12" >
            <string length="5" />
        </field>
        <field name="Mx14_03" id="13" >
            <decimal min="0" max="99.9" />
        </field>
        <field name="Mx14_04" id="14" >
            <integer min="1" max="255"/>
        </field>
    </M1>
    <M2 id= "2">
        <field name="Mx24_02" id="22" >
            <string length="5" />
        </field>
        <field name="Mx24_03" id="23" >
            <integer min="1" max="512"/>
        </field>
    </M2>
</Mx_Msg>
...
Aktuell habe ich für jede Mx Nachricht eine eigene Dekodierungsfunktion, soweit so gut.
Da sich die XML Datei immer wieder (fast monatlich) ändert, muss ich immer wieder am Code Änderungen vornehmen.
Auch wenn es sich nur um Kleinigkeiten handelt, meistens ändern sich für einen Test nur die Wertebereiche, stellt sich mir
die Frage ob das nicht sinnvoller geht?
Kann ich auf clevere Art und Weise aus dem XML Code generieren? Am besten nur zur Laufzeit!?
Geht so was mit Python?
Wenn ja, was sind Schlagwörter nach denen ich suchen muss?
Wenn nein oder wenn Ihr es für nicht sinnvoll erachtet, wie würdet Ihr sowas lösen?

Danke und Gruß
Claudia
lunar

@myxin: Vielleicht hilft Dir lxml.objectify. Damit kannst Du XML-Dokumente direkt als Objekt-Hierarchie laden.

Ansonsten würde ich in Deiner Situation vielleicht Attributnamen auf XPath-Ausdrücke abbilden, und Objekte dann dynamisch über die zugehörigen XPath-Ausdrücke initialisieren. Dank den Introspection-Möglichkeiten von Python ist sowas recht trivial.
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

@lunar,

vielen Dank. Das http://lxml.de/objectify.html scheint eine Möglichkeit zu sein, werde ich mir auf jeden Fall näher anschauen.
Darf ich aber fragen, was Du mit Introspection-Möglichkeiten von Python meinst?
Ich habe danach gegoogelt und es sieht so aus, dass damit die Möglichkeit gemeint ist, herauszufinden was für
Eigenschaften und Funktionen ein Objekt hat, stimmt das?
Wenn ja, wie erstelle ich solche Objekte zur Laufzeit?

Danke
Claudia
lunar

@myxin: Ja, genau das versteht man unter Introspection. Wenn Du das jetzt konkret einsetzen kannst, um Deine XML-Struktur auf Objekte abzubilden, kann man Dir ohne nähere Informationen zur Struktur nicht beantworten. Zudem gäbe es verschiedene Möglichkeiten (e.g. implizit über Deskriptoren, explizit über ein dict() von Attributnamen auf XPath-Ausdrücke, usw.).
myxin
User
Beiträge: 47
Registriert: Dienstag 10. Januar 2012, 16:57

@lunar, vielen Dank für deine Hilfe. Das mit den descriptors ist ebenfalls interessant, aber für mich wahrscheinlich noch ein bisschen kryptisch.

Das ich nicht auf die Idee gekommen bin, ein dict() zu nehmen und da eine Funktion zu hinterlegen, das ärgert mich ziemlich.

Letztendlich habe ich 3 verschiedene Datentypen, string, integer und decimal, diese müssen unterschiedlich dekodiert/interpretiert werden.
Also was zu tun ist wäre
a) eine Funktion schreiben, welche das XML liest und dann für jede Nachricht ein Klasse anlegt, welche die dazugehörigen Felder, nebst Datentyp und Wertebereich beinhaltet.
b) ein dict() Objekt, dass als Schlüssel den Datentyp hat und als Wert auf die Funktion, die dekodieren soll, verweist.
That's it.
Ich bekomme die Daten, ermittle die Nachricht, schaue in der Klasse nach den Feldern und rufe über den Datentyp die dazugehörige Funktion auf.

Dann sollte, sloange kein neuer Datentyp hinzu kommt, jede Änderung kein Problem mehr darstellen.

Ich glaube das ist es ... werde auch gleich mal damit beginnen

Merci
Claudia
Antworten