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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top