Seite 1 von 1

XML-Inhalt austauschen

Verfasst: Sonntag 2. Februar 2014, 17:47
von MarcelF6
Hallo miteinander

Gibt es einen simplem Aufruf, mit dem ich den Inhalt eines bestimmten Tags in einem xml-File mit dem Inhalt eines anderen Files austauschhen kann?

Ich habe im Moment im alten File sowas:

Code: Alles auswählen

<xml>
    <vornamen>
         <p1>Max</p1>
         <p2>Peter</p2>
    </vornamen>
</xml>
Nun möchte ich alles, was im Tag "vornamen" steht, löschen und durch den Inhalt eines zweiten Files ersetzten. (Das Tag heisst dort ebenfalls "vornamen").
Wie kann ich das machen? Am liebsten so, dass das Tag "vornamen" wieder an gleicher Stelle im ersten File zu stehen kommt...

Vielen Dank für die Hilfe,
marcel

Re: XML-Inhalt austauschen

Verfasst: Sonntag 2. Februar 2014, 18:36
von EyDu
Hallo.

Das Stichwort lautet "XPath". Damit kannst du nach Elementen suchen und diese dann anschließend entfernen.

Re: XML-Inhalt austauschen

Verfasst: Sonntag 2. Februar 2014, 19:14
von Sirius3
@MarcelF6: was hast Du bisher versucht? XML-Dateien werden normalerweise als Bäume geladen und darin kannst Du natürlich bestimmte Äste durch andere austauschen. Beim Rausschreiben ist die Reihenfolge der Tags wieder die selbe. Dazu reicht ElementTree aus der Standardbibliothek mit der find-Methode.

Re: XML-Inhalt austauschen

Verfasst: Montag 3. Februar 2014, 00:51
von MarcelF6
Vielen Dank für eure Antworten.
Also das Löschen des Tags war kein Problem.
Nun möchte ich aber den gesamten Inhalt des einen Files in das ursprüngliche setzten.
Das kleine File hat das Format:

Code: Alles auswählen

<vornamen>
    <p1>....</p1>
    <p2>....</p2>
</vornamen>
Das ursprüngliche File sieht so aus:

Code: Alles auswählen

<data>
    <adressen>
        <ad1>....</ad1>
    </adressen>
</data>
Was ich gerne möchte:

Code: Alles auswählen

<data>
    <vornamen>
        <p1>....</p1>
        <p2>....</p2>
    </vornamen>
    <adressen>
        <ad1>....</ad1>
    </adressen>
</data>
Ich habe es schon mit SubElement probiert, aber das klappte nicht.
Mir kam zudem die Idee, via Strings zu arbeiten (also einfach den Inhalt des kleineren Files kopieren und dann im grösseren einsetzen).
Mir scheint die Lösung allerdings nicht allzu elegant zu sein...wie würdet ihr das machen?

Re: XML-Inhalt austauschen

Verfasst: Montag 3. Februar 2014, 07:15
von Sirius3
Die Dokumentation von ElementTree ist jetzt nicht so lang, um nicht den richtigen Abschnitt finden zu können:

Code: Alles auswählen

import xml.etree.ElementTree as ET

def main():
    daten = ET.parse('daten.xml')
    name = ET.parse('name.xml')
    daten.getroot().insert(0, name.getroot())
    daten.write('daten_neu.xml')
    
if __name__ == '__main__':
    main()
Dein XML-Format ist übrigens schlecht. Wenn Du anfängst Tagnamen durchzunummerieren, machst Du irgendetwas falsch. XML hat eine Ordnung, man muß sie also nicht künstlich erzeugen. Wie willst Du in Deinem Format einfach nach allen Adressen fragen, ohne in einer Schleife alle 'ad's durchzugehen? Was bedeutet es, wenn ad17 fehlt und es erst wieder mit ad23 weitergeht? Sprechendere Namen als "p" oder "ad" wären auch gut.

Re: XML-Inhalt austauschen

Verfasst: Montag 3. Februar 2014, 15:02
von MarcelF6
Herzlichen Dank für die Antworten und die Anregungen! :)
Und: Du hast recht; ich habe die Zahlen nun im Attribut - viiiiiel besser. :)
Danke!

Re: XML-Inhalt austauschen

Verfasst: Montag 3. Februar 2014, 17:23
von Sirius3
@MarcelF6: normalerweise braucht man gar keine Zahl!