2010-10-03 5 views
0

Hey. Je veux avoir un fichier config.xml pour les paramètres dans une application Web Python. J'ai fait manuellement car.xml. Il ressemble à ceci:Édition de valeurs dans un fichier XML avec Python

<car> 
    <lights> 
     <blinkers>off</blinkers> 
    </lights> 
</car> 

Maintenant, je veux voir si les feux clignotants sont allumés ou éteints, en utilisant xml.etree.ElementTree.

import xml.etree.ElementTree as ET 
tree = ET.parse('car.xml') 
blinkers = tree.findtext('lights/blinkers') 
print blinkers 
> off 

Maintenant, je veux allumer et éteindre les clignotants, comment puis-je faire cela?

+5

vous ne voulez pas vraiment un fichier xml. Vous voulez un simple nom de module python 'settings' avec des constantes de niveau de module dans ALLCAPS qui ont toutes les informations que vous pensiez que vous vouliez stocker dans xml. Vous pouvez avoir des tuples, des listes, des dictionnaires, des nombres entiers, des flottants, etc. Quand une partie de votre application a besoin d'un paramètre, FOO, elle peut simplement faire les réglages d'importation; settings.FOO'. – aaronasterling

+0

Je peux voir comment cela serait plus rapide et plus facile pour les paramètres, merci. Mais disons que j'ai un CMS qui stocke des articles en XML, si les clignotants étaient "en tête", comment pourrais-je changer cette rubrique. – Frode

Répondre

0

XML est une façon assez pauvre de stocker les paramètres de configuration. D'une part, XML n'est pas vraiment humain dans le contexte des paramètres. Dans l'univers Python en particulier, il vaut mieux utiliser un module de paramètres (comme @AaronMcSmooth commenté). Malheureusement, beaucoup de projets dans le monde Java ont (mis?) Utilisé XML pour les paramètres, ce qui en fait une tendance. Je dirais que cette tendance est vraiment nulle. Utilisez les paramètres natifs (module en Python) ou quelque chose de plus humain comme YAML.

1

Jetez un coup d'œil à this article. Mais considérez le commentaire de AaronMcSmooth ci-dessus - cela peut être la mauvaise approche de votre problème global.

2

Vous pouvez supprimer des nœuds en appelant la méthode du nœud parent remove, et insérer des noeuds en appelant 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') 
2

Sans aborder le fond de l'utilisation de XML au lieu d'un module Python pour la gestion des fichiers de configuration, voici comment faire ce que vous avez demandé en utilisant 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>' 
Questions connexes