XML-File modifizieren

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,

ich würde gerne ein existierendes XML-File einlesen und gewisse Inhalte verändern.
Konkret habe ich zurzeit ein XML-File gegeben, das folgende Struktur hat:
<ner><persons><person id="1">
<address>Fr.</address>
<titles/>
<firstname>Mary</firstname>
<lastname>Müller</lastname>
<gender>F</gender>
<profession/>
<references>
<reference>
<positions>
<position>68-590-1</position>
<position>68-590-2</position>
</positions>
<positions>
<position>68-590-6</position>
<position>68-590-7</position>
</positions>
</reference>
</references>
</person>
</persons>
</ner>
Nun möchte ich überprüfen, ob Frau Müller bereits den Beruf "Lehrerin" hat. Falls nein, soll der Beruf und die Position, an der der Beruf gefunden wurde, hinzugefügt werden.
Falls der Beruf schon da ist, aber noch nicht in positions, soll einfach die Position hinzugefügt werden.
Falls alles schon da ist, muss nichts verändert werden.

Den Beruf und die Position extrahiere ich aus einem anderen File - wir können also annehmen, dass diese Angaben vorhanden sind.

Bis jetzt habe ich es mit minidom probiert:

Code: Alles auswählen

from xml.dom import minidom

doc = minidom.parse('SAC-Jahrbuch_1895_mul-ner.xml')
person = doc.getElementsByTagName('person')
lastnames = doc.getElementsByTagName('lastname')
positions = doc.getElementsByTagName('position')
professions = doc.getElementsByTagName('profession')
for ln in lastnames:
        for pos in positions:
                if ln.firstChild.nodeValue == u"Müller" and pos.firstChild.nodeValue == "68-590-2":
                    print "right person"
Mit dem Code oben bin ich zwar dann bei der richtigen Person - wie aber kann ich dann noch prüfen, ob der Beruf vorhanden ist, bzw. ihn und die Position hinzufügen?

Danke für jeden Hinweis.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ich würde Dir ja raten, die ElementTree-API zu nutzen; entweder durch das Mdoul ``etree`` in der Standard-Lib oder durch das exzellente, externe ``lxml``-Modul. Letzteres beherrscht auch "XPath", womit das Extrahieren von Daten oftmals noch einfacher von der Hand geht.

Grundsätzlich ist die Frage, ob das Vorgehen an sich so richtig und sinnvoll ist. Ich würde wohl eher so vorgehen, dass ich mir ein Domänenmodell schaffe, welches z.B. in einem Dictionary oder durch Klassen (oder eine Kombi von beiden und ggf. andere elementaren Datenstrukturen) repräsentiert werden kann.

Dann würde ich mir einen Parser schreiben, welcher mir eine solche Entität aus einer gegebenen XML-Datei einlesen kann.

In meinem Domänenmodell selber würde ich dan Logiken zum Ergänzen von Informationen schaffen.

Schließlich würde ich eine Funktionalität schaffen, mit der ich eine solche Entität in eine neue oder aber auch in eine bestehende XML-Datei zurückschreiben kann.

Wenn das natürlich nur eine Art Patching an den XML-Daten ist und diese anderweitig verarbeitet werden sollen, dann kann man das natürlich auch so machen, wie Du das planst.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
BlackJack

Ist ja nicht so dass das der erste Beitrag von MarcelF6 zum Thema XML ist, oder das vom `minidom` abgeraten wurde. Ich habe so ein bisschen das Gefühl das da keine Weiterentwicklung stattfindet. Jedes mal kommen im Grunde sehr ähnliche Fragen und jedes mal habe ich das Gefühl wir fangen wieder bei Null an. :-(
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Jetzt wo Du es sagst... hatte mir den Autor gar nicht wirklich angeguckt :-D

Naja, was solls... besser eine gute Tat zu viel als eine böse ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
ngulam
User
Beiträge: 35
Registriert: Freitag 18. Oktober 2013, 11:03

Jetzt nutzt er lxml und versucht es hier
http://stackoverflow.com/questions/2359 ... using-lxml

8)
งูหลาม
BlackJack

Die Frage wurde vom Autor zurückgezogen. :shock:
Antworten