Attribut eines Elements in XML-Datei verändern

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
Erhy
User
Beiträge: 64
Registriert: Mittwoch 2. Januar 2019, 21:09

Hallo!
Ich dachte mir, dass ist ein Klacks.
Meine IDE meldet Warnungen bei import xml.etree
Daraufhin habe ich defusedxml importiert.

Finde aber keine brauchbare Dok für defusedxml oder sinnvolle Beispiele damit.

Mein einfache Aufgabe:
Eine XML Datei lesen
ein Attribut eines Elements ändern.
XML Datei schreiben

Danke für euren Rat
Erhy
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Erhy hat geschrieben: Donnerstag 5. Dezember 2019, 14:45 Meine IDE meldet Warnungen bei import xml.etree
Dann solltest du versuchen den Warnungen auf den Grund zu gehen statt irgendwas zu installieren von dem du anhand des Namens glaubst das du es brauchen könntest aber keine Dokumentation dazu hast.

Also Butter bei die Fische: Welche Warnungen oder Fehler bekommst du? Und bitte per Copy&Paste, nicht einfach ein "dass es nicht geht".
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Funktioniert fuer mich problemlos:

Code: Alles auswählen

import xml.etree.ElementTree as ET

XML = """<?xml version="1.0"?>
<data>
    <country name="Liechtenstein">
        <rank>1</rank>
        <year>2008</year>
        <gdppc>141100</gdppc>
        <neighbor name="Austria" direction="E"/>
        <neighbor name="Switzerland" direction="W"/>
    </country>
    <country name="Singapore">
        <rank>4</rank>
        <year>2011</year>
        <gdppc>59900</gdppc>
        <neighbor name="Malaysia" direction="N"/>
    </country>
    <country name="Panama">
        <rank>68</rank>
        <year>2011</year>
        <gdppc>13600</gdppc>
        <neighbor name="Costa Rica" direction="W"/>
        <neighbor name="Colombia" direction="E"/>
    </country>
</data>"""

root = ET.fromstring(XML)
root[0][0].text = "1000" # Make Lichtenstein Poor Again
output = ET.tostring(root)
print(output)
Erhy
User
Beiträge: 64
Registriert: Mittwoch 2. Januar 2019, 21:09

Die Warnung:

Using xml.etree.ElementTree to parse untrusted XML data is known to be vulnerable to XML attacks. Replace xml.etree.ElementTree with the equivalent defusedxml package, or make sure defusedxml.defuse_stdlib() is called.
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Erhy: `defusedxml` hat eine Dokumentation. Was ist daran nicht brauchbar?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

Das ist ja nur eine Warnung Deiner IDE. Wenn Du nicht wirklich potential bösartige XML-Dateien parsen willst, kannst Du das ignorieren.
__deets__
User
Beiträge: 14541
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und so wie es klingt, hat defusedxml die gleiche API ("equivalent defusedxml package").
Erhy
User
Beiträge: 64
Registriert: Mittwoch 2. Januar 2019, 21:09

das funktionierte jetzt:

Code: Alles auswählen

import defusedxml.ElementTree as ET

tree = ET.parse(xmlPropFil)
root = tree.getroot()
elem = root.find('OPLandIPLparvo')
elej = elem.find('horizontalCellsGain')
elej.text = '0.7'
tree.write(xmlPropUpdFil,
           xml_declaration=True,encoding='utf-8',
           method="xml")
Benutzeravatar
__blackjack__
User
Beiträge: 13110
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Erhy: Ich kanns mir ja nicht verkneifen was zu den besch…eidenen Namen zu sagen. Mal davon abgesehen das bei 31 Beiträgen von Dir sicher schon mal zur Sprache kam das man Namen in Python klein_mit_unterstrichen scrheibt, sind Namen wo man sich fragt was die wohl bedeuten mögen *schlecht*.

`xmlPropFil` und `xmlPropUpdFil` zum Beispiel hat bei mir einen kleinen Augenblick gedauert, beim ersten weil ich erst `xmlProfil` gelesen habe und dann ist mir aufgegangen das jemand echt so tippfaul sein kann ein `e` am Ende wegzulassen. Ist dann natürlich immer noch inhaltlich falsch weil es keine Dateien sind, sondern Datei*namen*. Wenn man `file` in irgendeiner Variation liest, ist die Erwartungshaltung das diese Objekte eine `read()`- oder eine `write()`-Methode haben und eine `close()`-Methode. Denn *das* sind Dateien.

Bei dem `Prop`-Teil vermute ich mal es steht für `property`? Warum steht da nicht was gemeint ist? `Upd` steht vermutlich für `updated` — und wieder: Warum steht *das* da nicht? Namen raten müssen ist doof.

Bei `elem` denke ich weiss ich wofür es steht, bei `elej` habe ich ja irgendwie die Befürchtung das steht für „`element` + ich weiss nicht, vielleicht hänge ich da ja noch einen zufälligen Buchstaben an um einen neuen Namen zu haben“.

Man muss auch nicht zwingend jedes kleine Zwischenergebnis an einen Namen binden, dann muss man sich auch nicht gezwungenerweise Namen dafür ausdenken.

Code: Alles auswählen

    tree = ET.parse(property_xml_filename)
    element = tree.getroot().find("OPLandIPLparvo").find("horizontalCellsGain")
    element.text = "0.7"
    tree.write(
        updated_property_xml_filename, encoding="utf-8", xml_declaration=True
    )
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten