xml.dom.minidom Verständnisproblem

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
paeppi_79
User
Beiträge: 27
Registriert: Montag 13. Juli 2009, 19:33

Hallo,
ich arbeite gerade an einem Projekt wo ich mit XML Dateien arbeiten muss.
Das erstellen einer solchen Datei und das lesen funktioniert soweit.
Jetzt habe ich das Problem dass ich einen einzelnen Wert ändern muss ohne den ganzen Baum neu zu erstellen.

Gibt es eine ähnlich simple Art den Wert(Text) von Leistung auf einen neuen Wert zu setzen und in der XML zu speichern?

Code: Alles auswählen

        generator="MI36 "
        baum = dom.parse('MI.xml')
        for eintrag in baum.firstChild.childNodes:                              
            if eintrag.nodeName == "mi":
                if eintrag.getAttribute("id")==generator:                          
                    for knoten in eintrag.childNodes:
                        if knoten.nodeName == "Leistung": 
                            print "Leistung"
                            soll_p=(float(knoten.firstChild.data.strip()))

                        elif knoten.nodeName == "Spannung":
                            soll_u=(float(knoten.firstChild.data.strip()))
                                            
                        elif knoten.nodeName == "Strom":
                           soll_i=(float(knoten.firstChild.data.strip()))
                                            
                        elif knoten.nodeName == "Frequenz":
                            soll_f=(float(knoten.firstChild.data.strip()))
                                            
                        elif knoten.nodeName == "Leistung_V":
                            soll_p_archiv=(float(knoten.firstChild.data.strip()))
                                            
                        elif knoten.nodeName == "Spannung_V":
                            soll_u_archiv=(float(knoten.firstChild.data.strip()))
Zuletzt geändert von Anonymous am Freitag 25. November 2016, 23:00, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
BlackJack

@paeppi_79: Du kannst das `data`-Attribut nicht nur abfragen, sondern auch setzen.

Mein xml.dom.minidom Verständnisproblem ist ja das ich nicht verstehe warum irgendjemand dieses Modul verwendet. Insbesondere wo in der Standardbibliothek doch schon eine Alternative existiert die nicht so furchtbar nach Java aussieht.

Edit: Solltest Du trotzdem bei `minidom` bleiben wollen schau Dir wenigstens mal Methoden wie `getElementsByTagName()` und `getElementById()` an.
Sirius3
User
Beiträge: 18335
Registriert: Sonntag 21. Oktober 2012, 17:20

@paeppi_79: das ganze mal mit ElementTree, unter der Voraussetzung, dass die ID eindeutig ist und deshalb die ganzen for-Schleifen unnötig sind:

Code: Alles auswählen

from xml.etree.ElementTree import ElementTree

generator="MI36 "
baum = ElementTree(file='MI.xml')
eintrag = baum.find('mi[@id="%s"]' % generator)
soll_p = float(eintrag.findtext("Leisung"))
soll_u = float(eintrag.findtext("Spannung"))
soll_i = float(eintrag.findtext("Strom"))
soll_f = float(eintrag.findtext("Frequenz"))
soll_p_archiv = float(eintrag.findtext("Leistung_V"))
soll_u_archiv = float(eintrag.findtext("Spannung_V"))
Setzen geht da genaus einfach:

Code: Alles auswählen

eintrag.find("Leisung").text = str(soll_p)
Benutzeravatar
pixewakb
User
Beiträge: 1413
Registriert: Sonntag 24. April 2011, 19:43

Ich habe fürs XML-Parsen schon mal BeautifulSoup verwendet:

https://www.crummy.com/software/BeautifulSoup/

Ich meine mich zu erinnern, dass man XML angeben müsste, dass die Suppe korrekt zubereitet wird, danach ist es sehr einfach. XML-Schreiben geht damit m. E. nicht.
Antworten