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?

È stato utile?

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top