web-dev-qa-db-fra.com

Rechercher et remplacer des valeurs en XML à l'aide de Python

Je cherche à éditer des fichiers XML en utilisant python. Je veux trouver et remplacer des mots-clés dans les balises. Auparavant, un collègue avait configuré des fichiers XML de modèle et utilisé un programme "trouver et remplacer" pour remplacer ces mots clés. Je veux utiliser python pour trouver et remplacer ces mots clés par des valeurs. Je me suis enseigné le module Elementtree, mais j'ai du mal à essayer de trouver et de remplacer. J'ai joint un extrait de mon fichier XML. Vous verrez certaines variables entourées par% (c.-à-d.% SITEDESCR%). Ce sont les mots que je veux remplacer, puis enregistrez le code XML dans un nouveau fichier. Toute aide ou suggestion serait formidable.

Merci, Mike

<metadata>
<idinfo>
<citation>
<citeinfo>
 <Origin>My Company</Origin>
 <pubdate>05/04/2009</pubdate>
 <title>POLYGONS</title>
 <geoform>vector digital data</geoform>
 <onlink>\\C$\ArcGISDevelopment\Geodatabase\PDA_STD_05_25_2009.gdb</onlink>
</citeinfo>
</citation>
 <descript>
 <abstract>This dataset represents the mapped polygons developed from the field data for the %SITEDESCR%.</abstract>
 <purpose>This dataset was created to accompany some stuff.</purpose>
 </descript>
<timeperd>
<timeinfo>
<rngdates>
 <begdate>%begdate%</begdate>
 <begtime>unknown</begtime>
 <enddate>%enddate%</enddate>
 <endtime>unknown</endtime>
 </rngdates>
 </timeinfo>
 <current>ground condition</current>
 </timeperd>
22
Mike

Les bases:

from xml.etree import ElementTree as et
tree = et.parse(datafile)
tree.find('idinfo/timeperd/timeinfo/rngdates/begdate').text = '1/1/2011'
tree.find('idinfo/timeperd/timeinfo/rngdates/enddate').text = '1/1/2011'
tree.write(datafile)

Vous pouvez raccourcir le chemin si le nom de la balise est unique. Cette syntaxe recherche le premier nœud à n'importe quel niveau de profondeur de l'arborescence.

tree.find('.//begdate').text = '1/1/2011'
tree.find('.//enddate').text = '1/1/2011'

Lisez également la documentation , esp. le XPath support pour la localisation des nœuds.

39
Mark Tolonen

Si vous souhaitez simplement remplacer les bits entre %, il ne s'agit pas vraiment d'un problème XML. Vous pouvez facilement le faire avec regex:

import re
xmlstring = open('myxmldocument.xml', 'r').read()
substitutions = {'SITEDESCR': 'myvalue', ...}
pattern = re.compile(r'%([^%]+)%')
xmlstring = re.sub(pattern, lambda m: substitutions[m.group(1)], xmlstring)
5
Ismail Badawi

Il suffit de lire le fichier ligne par ligne et de remplacer:

for line in open(template_file_name,'r'):
  output_line = line
  output_line = string.replace(output_line, placeholder, value)
  print output_line 
0
Rostislav Matl