Trouver et remplacer des valeurs dans XML en utilisant Python

je cherche à éditer des fichiers XML en utilisant python. Je veux trouver et remplacer des mots-clés dans les balises. Par le passé, un collègue avait créé des fichiers XML types et utilisé un programme de recherche et de remplacement 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 à trouver et à remplacer. J'ai joint un snid-bit de mon fichier XML. Vous verrez certaines variables entourées de % (i.e. %SITEDESCR%) ce sont les mots que je veux remplacer et ensuite sauvegarder le XML dans un nouveau fichier. Toute aide ou suggestion serait génial.

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$ArcGISDevelopmentGeodatabasePDA_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>
21
demandé sur Mike 2011-06-29 20:18:35

3 réponses

Les principes de base:

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 trouve le premier nœud à n'importe quel niveau de profondeur dans l'arbre.

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

lisez Également le documentation, esp. XPath prise en charge de la localisation des noeuds.

34
répondu Mark Tolonen 2011-06-29 16:45:46

si vous voulez juste remplacer les bits inclus par %, alors ce n'est pas vraiment 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
répondu Ismail Badawi 2011-06-29 16:25:00

Juste lire le fichier ligne par ligne et remplacer:

for line in open(template_file_name,'r'):
  output_line = line
  output_line = string.replace(output_line, placeholder, value)
  print output_line 
0
répondu Rostislav Matl 2011-06-29 16:25:50