2010-06-01 4 views
1

J'essaie d'utiliser Python pour lire dans un fichier XML contenant des noms de paramètres et des valeurs, par ex.Modification du contenu du fichier XML avec Python

... 
    <parameter name='par1'> 
     <value>24</value> 
    </parameter> 
    <parameter name='par2'> 
     <value>Blue/Red/Green</value> 
    </parameter> 
    ... 

puis passer un dictionnaire avec les noms de paramètres { 'de PAR1': '53', 'PAR2': 'Jaune/Rose/Noir', ...} et correspondant nouvelles valeurs pour remplacer les anciens dans le fichier XML. La sortie doit ensuite remplacer le fichier XML d'origine.

Actuellement, je convertis le XML en un dictionnaire python et après une comparaison d'éléments et un traitement d'expression régulière, je réécris la sortie au format XML.

Je ne suis pas trop heureux avec cela et je me demandais si quelqu'un peut recommander une façon plus efficace de le faire?

Merci.

Répondre

3

Ma première suggestion est d'utiliser lxml ou un autre Python XML parser plutôt que d'utiliser des expressions régulières. XML n'est pas un langage qui peut être analysé de manière fiable avec les expressions régulières. (Si vous essayez toujours d'analyser XML avec des expressions régulières bad things happen)

+0

Je recommande particulièrement lxml. Il inclut une API etree compatible avec xml.etree.Elementree, mais possède également un certain nombre de fonctionnalités supplémentaires utiles. Le seul inconvénient possible est que (apparemment) il est difficile à installer sur certaines plates-formes. Je n'ai jamais eu de problème, mais j'ai entendu cette plainte à plusieurs reprises. –

0

Si vous avez lu dans vos deux anciens et nouveaux fichiers XML et les stockés sous forme de dictionnaires, en remplaçant alors les anciennes valeurs est facile - utiliser update():

dict_old.update(dict_new) 

Ceci met à jour le dictionnaire d'origine avec les paires clé/valeur de dict_new, en écrasant les clés existantes. Les expressions régulières sont inutiles, puisque vous ne voulez probablement que faire correspondre des clés exactes.

1

xml.etree.ElementTree est beaucoup plus pythonique que les autres parseurs XML.

Un exemple la construction d'un dict basé sur vos données:

>>> src = """<params> 
    <parameter name='par1'> <value>24</value> </parameter> 
    <parameter name='par2'> <value>Blue/Red/Green</value> </parameter> 
    </params> 
    """ 
>>> tree = ElementTree.XML(src) 
>>> dict(((i.attrib['name'], i.find('value').text) for i in tree.getiterator('parameter'))) 
{'par2': 'Blue/Red/Green', 'par1': '24'} 
>>> 

Après avoir changé dict valeurs, construire une nouvelle ElementTree en utilisant des méthodes similaires, et générer un fichier XML avec la méthode write. Notez les exemples dans le document référencé qui montrent comment modifier le contenu directement dans la structure etree. Peut-être qu'un dict n'est pas nécessaire.

Questions connexes