XML Konten Element verschieben

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
puwo1407
User
Beiträge: 2
Registriert: Samstag 14. Januar 2017, 13:56

Hallo zusammen,

ich erhalte XML Dateien, welche ich automatisiert in mein ERP einlesen möchte.
Leider sind die Knotenpunkte innerhalb eines Files falsch angeordnet.

Originalfile:
<?XML Version="1.0" Encoding="ISO-8859-1"?>
<bestellung>
+ <produkte>
+ <bestellinfo>
</bestellung>

diese Reihenfolge würde ich brauchen
<?XML Version="1.0" Encoding="ISO-8859-1"?>
<bestellung>
+ <bestellinfo>
+ <produkte>
</bestellung>

Kann mir hier jemand helfen?

Danke liebes Team

puwo
nezzcarth
User
Beiträge: 1634
Registriert: Samstag 16. April 2011, 12:47

Ich weiß, XSLT genießt einen zweifelhaften Ruf, aber das ließe sich damit sehr leicht bewerkstelligen -- ob nun aus Python heraus (mit lxml), oder mit einem externen Prozessor wie Saxon.
Benutzeravatar
pyHoax
User
Beiträge: 84
Registriert: Donnerstag 15. Dezember 2016, 19:17

Kann mir hier jemand helfen?
Mal schauen.

Dir liegt eine wrong_order.xml vor und möchtst diese in correct_order.xml umwandeln ?
ICh glaub ich kann mich erinnern, das erzwingen einen Reihenfolge der childs eines parents ist etwas tricky.

Wenn du die schema datei hast?
Und ein Besipiel xml wäre nicht schlecht.
Zuletzt geändert von pyHoax am Samstag 14. Januar 2017, 15:00, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@puwo1407: das geht mit ElementTree sehr einfach. Z.B. »tree.find('.//bestellung').getchildren().reverse()«
puwo1407
User
Beiträge: 2
Registriert: Samstag 14. Januar 2017, 13:56

Ich habe erst gestern mit python begonnen, hab mir auch ein Buch bestellt
Habe Windows10 und verwende 3.6
Aus irgendeinem Grund funktioniert auch die IntelliSense nicht wirklich....

Habs mal so probiert, funktioniert natürlich NICHT....

Code: Alles auswählen

# Import the os module, for the os.walk function
import os
import xml.etree.ElementTree as ET

from collections import namedtuple

# Set the directory you want to start from
rootDir = '.'
for dirName, subdirList, fileList in os.walk(rootDir):
    #print('Found directory: %s' % dirName)
    for fname in fileList:
        #print('\t%s' % fname)
        tree = ET.parse(fname)
        root = tree.getroot()
        
        tree.find(".//bestellung").getchildren().reverse()
        tree.write(fname + 'output.xml')

lg
Zuletzt geändert von Anonymous am Samstag 14. Januar 2017, 18:40, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@puwo1407: was heißt »funktioniert NICHT«? Python liefert einem einen ausführlichen Traceback, an dem man genau erkennen kann, was nicht funktioniert. So kann man jetzt viele Fehlerursachen raten: die Datei existiert nicht, weil sie in einem Unterverzeichnis liegt, die Datei ist keine XML-Datei, weil Du ja alle Dateien durchgehst. Das gesuchte Tag ist das root-Tag, so dass man »find« weglassen kann und direkt »root.getchildren().reverse()« schreiben kann. Oder irgendein anderer Fehler; mit einem frustrierten »funktioniert natürlich NICHT« ist die Fehlersuche aber natürlich frustrierend.
Antworten