xml konverter mit python

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
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Donnerstag 28. April 2005, 09:02

Hi,

ich muss einen Konverter basteln und zwar der aus einer Siron Beschreibung die XML Struktur erzeugt. Die DTD ist mir auch schon vorgegeben.

Praktisch sieht so die Siron BEschreibung aus:

Code: Alles auswählen

    04 NUMMER     FU     4.0;       97
*% Žnderungsnummer
    04 AEDATEN               ; NEU  101
*% Abschnitt A
       07 KDNGES               ; NEU  101
*% Kunden- und Objektnummer
          10 KDNGESR     C     12  ;      101
*% Redefinition Kunden- u. Objektnummer
          10 KDNR     C      8  ;      101
*% Kundennummer
          10 OBJNR     C      4  ;      109
*% Objektnummer
       07 SKZSTA     C      3  ;      113
*% Kundenstatus (Tabelle 0170)
       07 DATSTAT     C      8  ;      116
*% Datum der Vergabe des Kundenstatus
       07 KDNRALT     C     10  ;      124
*% Kundennummer aus TA (vor Umstellung TAR)
       07 KDNRAZU     C     10  ;      134
*% Kundennummer alt Zusatz
       07 SAMNRG               ; NEU  144
*% Sammler-Kunden- und Objektnummer
          10 SMKDNRG     C     12  ;      144
*% Redefinition Sammlernummer gesamt
Praktisch steht dort Feldname, C szeht für alhanumerisch die zahl danch ist die Länge des Feldes und nach dem Semikolon das ist die Position.

die xml Beschreibung dazu würde so aussehen:

Code: Alles auswählen

<FixedLength>
			<FixedColumn>
			<Name>NUMMER</Name>
			<Numeric/> 
			<FixedRange>
				<From>97</From>
				<Length>4</Length>
			</FixedRange>
			</FixedColumn>
			<FixedColumn>
			<Name>KDNGESR</Name>
			<AlphaNumeric/> 
			<FixedRange>
				<From>101</From>
				<Length>12</Length>
			</FixedRange>
			</FixedColumn>
Is das überhaupt mit Python zu realisieren?

MFG

Robert

Edit (Leonidas): Daten in Code Tags gesetzt.
joe

Donnerstag 28. April 2005, 09:56

Hi!
Calanetics hat geschrieben: Is das überhaupt mit Python zu realisieren?
Kein problem, das ja reine string-verarbeitung. Wenn dein beispiel vollständig ist, sieht ja jedes FixedColumn-element so aus:

Code: Alles auswählen

fixedColumnTempl = """<FixedColumn>
<Name>%s</Name>
<%s/>
<FixedRange>
<From>%s</From>
<Length>%s</Length>
</FixedRange>
</FixedColumn>"""
Aus den daten der quellzeilen erzeugst du dann ein tupel, mitdem du dann das template füllst: fixcol = fixedColumnTempl % (name,type,From,length)

Den typ (numerisch, alphanumerisch) als elementname vorzusehen, halte ich allerdings für einen fehler. Besser wäre <type>numeric</type> oder als attribut: <Name type="alphanumeric">.
joe
joe

Donnerstag 28. April 2005, 10:20

joe hat geschrieben:oder als attribut: <Name type="alphanumeric">.
joe
<FixedColumn type="alphanumeric">, wenn schon.
joe
Calanetics
User
Beiträge: 19
Registriert: Donnerstag 23. Oktober 2003, 08:04
Kontaktdaten:

Donnerstag 28. April 2005, 11:35

Hi,

mhh also bisher hab ich mal die allgemine schritte so gemacht.

Code: Alles auswählen

#!/usr/bin/env python 
import string 



f =open ("C:/windows/temp/test.txt", 'r')   
ausgabe=open ("C:/windows/temp/test.xml", 'w')     
L =[] 
for line in f.readlines():  
    linearray = line.split(" ") 
    if linearray[3] == " FU " : 
        L = numeric 

ausgabe.writelines(hier die tupel?)
f.close()


So 100% bin ich noch nicht hintergestiegen.probiers schon viel rum. ich habe die Beschreibung die er einliiest. und eine Ausgabedatei in der der xml text generiert werden soll. jede zeile wird abgearbeitet und jedes Feld in der Zeile müßte doch erstmal ausgewertet werden ooder?

Ich würd mich freuen wenns sich jemand erbarmen könnt mir es noch nächer zu bringen:)

MFG

Robert
joe

Donnerstag 28. April 2005, 12:15

untested:

Code: Alles auswählen

f =open ("C:/windows/temp/test.txt", 'r')   
ausgabe=open ("C:/windows/temp/test.xml", 'w')     

fixedColumnTempl = """<FixedColumn>
<Name>%s</Name>
<%s/>
<FixedRange>
<From>%s</From>
<Length>%s</Length>
</FixedRange>
</FixedColumn>""" 

for line in f.readlines(): 
    if not ";" in line: continue # keine datenzeile
    line,From = line.split(";")
    line = line.strip()
    linearray = line.split(" ")
    Name = linearray[1]
    if len(linearray) > 2:
        if linearray[2] == " FU ":
            Type = "numeric"
        else  # dann kann es nur C sein
            Type = "alphanumeric"
        Length = linearray[3]
    else
        Type = ""
        Length = ""
    
    ausgabe.write(fixedColumnTempl % (Name,Type,From,Length))

ausgabe.close()
f.close()
joe
Benutzeravatar
jens
Moderator
Beiträge: 8481
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Donnerstag 28. April 2005, 14:40

Ich mache das ganze lieber so:

Code: Alles auswählen

fixedColumnTempl = """<FixedColumn>
<Name>%(name)s</Name>
<%(typ)s/>
<FixedRange>
<From>%(from)s</From>
<Length>%(length)s</Length>
</FixedRange>
</FixedColumn>"""

[...]

ausgabe.write( fixedColumnTempl % {
    "name": Name,
    "type": Type,
    "from": From,
    "length": Length
)
Da weiß man besser wo was hinkommt... Wenn man im Template die Positionen ändert, funktioniert es immernoch 8)

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Antworten