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
Attribut eines Elements in XML-Datei verändern
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".
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)
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.
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.
- __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
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")
- __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.
`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