Bearbeiten von Werten in einer XML-Datei mit Python
-
27-09-2019 - |
Frage
Hey. Ich mag für Einstellungen in einer Python-Web-App eine Datei Config.xml haben.
Ich habe car.xml manuell. Es sieht wie folgt aus:
<car>
<lights>
<blinkers>off</blinkers>
</lights>
</car>
Jetzt möchte ich, um zu sehen, ob die Scheuklappen ein- oder ausgeschaltet sind, mit xml.etree.ElementTree .
import xml.etree.ElementTree as ET
tree = ET.parse('car.xml')
blinkers = tree.findtext('lights/blinkers')
print blinkers
> off
Jetzt möchte ich die Scheuklappen ein- und ausschalten, wie kann ich das tun?
Lösung
XML ist eine ziemlich schlechte Art und Weise Konfigurationseinstellungen zu speichern. Zum einen ist XML nicht gerade freundlich im Zusammenhang mit Einstellungen Mensch. Im Python Universum insbesondere sind Sie besser dran, ein Einstellungsmodul (als @AaronMcSmooth kommentiert). Leider haben viele Projekte in der Java-Welt (mis?) Verwendete XML für Einstellungen damit es einen Trend zu machen. Ich würde argumentieren, dass dieser Trend wirklich saugt. Verwenden Sie nativen Einstellungen (Modul in Python) oder etwas mehr menschliche freundlich wie YAML.
Andere Tipps
Sie können die Knoten entfernen, indem Sie den übergeordneten Knoten des remove
Methode aufrufen,
und Einsatz Knoten durch ET.SubElement Aufruf:
import xml.etree.ElementTree as ET
def flip_lights(tree):
lights = tree.find('lights')
state=get_blinker(tree)
blinkers = tree.find('lights/blinkers')
lights.remove(blinkers)
new_blinkers = ET.SubElement(lights, "blinkers")
new_blinkers.text='on' if state=='off' else 'off'
def get_blinker(tree):
blinkers = tree.find('lights/blinkers')
return blinkers.text
tree = ET.parse('car.xml')
print(get_blinker(tree))
# off
flip_lights(tree)
print(get_blinker(tree))
# on
flip_lights(tree)
print(get_blinker(tree))
# off
flip_lights(tree)
print(get_blinker(tree))
# on
tree.write('car2.xml')
Ohne die Verdienste Adressierung von XML anstelle einer Python-Modul für Konfigurationsdateien verwalten, ist hier, wie zu tun, was Sie gefragt lxml
mit:
>>> from lxml import etree
>>> xml = """<car>
<lights>
<blinkers>on</blinkers>
</lights>
</car>"""
>>> doc = etree.fromstring(xml)
>>> elm = doc.xpath("/car/lights/blinkers")[0]
>>> elm.text="off"
>>> etree.tostring(doc)
'<car>\n <lights>\n <blinkers>off</blinkers>\n </lights>\n</car>'
Hier finden Sie aktuelle diesem Artikel .
Aber betrachte AaronMcSmooth Kommentar oben -. Dies der falsche Ansatz, um Ihr allgemeines Problem sein kann
Mit beautifulstonesoup. Hier ist der Abschnitt zum Ändern von xml: