Modifica di valori in un file XML con Python
-
27-09-2019 - |
Domanda
Ciao. Voglio avere un file config.xml per le impostazioni in un web app Python.
Ho fatto car.xml manualmente. Ecco come si presenta:
<car>
<lights>
<blinkers>off</blinkers>
</lights>
</car>
Ora voglio vedere se i lampeggiatori sono accesi o spenti, utilizzando xml.etree.ElementTree .
import xml.etree.ElementTree as ET
tree = ET.parse('car.xml')
blinkers = tree.findtext('lights/blinkers')
print blinkers
> off
Ora voglio girare il paraocchi e fuori, come posso fare questo?
Soluzione
XML è un modo piuttosto povero di memorizzare le impostazioni di configurazione. Per uno, XML non è esattamente umana amichevole nel contesto degli ambienti. Nell'universo Python, in particolare, si sta meglio utilizzando un modulo di impostazioni (come ha commentato @AaronMcSmooth). Purtroppo un sacco di progetti in tutto il mondo Java hanno (mal?) XML utilizzati per le impostazioni così da rendere una tendenza. Direi che questa tendenza fa davvero schifo. Utilizzare le impostazioni native (modulo in Python) o qualcosa di più amichevole uomo come YAML.
Altri suggerimenti
È possibile rimuovere i nodi chiamando il metodo remove
del nodo principale,
e l'inserto nodi chiamando ET.SubElement:
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')
Senza affrontare la questione del ricorso XML al posto di un modulo Python per la gestione di file di configurazione, ecco come fare quello che hai chiesto utilizzando lxml
:
>>> 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>'
Date un'occhiata al questo articolo .
Ma si consideri il commento di AaronMcSmooth sopra -. Questo può essere l'approccio sbagliato al problema generale
Usa beautifulstonesoup. Ecco la sezione su XML modifica: