XML-Inhalt austauschen

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
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

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
Zuletzt geändert von Anonymous am Sonntag 2. Februar 2014, 17:59, insgesamt 1-mal geändert.
Grund: Quelltext in XML-Code-Tags gesetzt.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo.

Das Stichwort lautet "XPath". Damit kannst du nach Elementen suchen und diese dann anschließend entfernen.
Das Leben ist wie ein Tennisball.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@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.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

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?
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
MarcelF6
User
Beiträge: 226
Registriert: Samstag 3. März 2012, 21:30

Herzlichen Dank für die Antworten und die Anregungen! :)
Und: Du hast recht; ich habe die Zahlen nun im Attribut - viiiiiel besser. :)
Danke!
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@MarcelF6: normalerweise braucht man gar keine Zahl!
Antworten