Найти и заменить значения в XML с помощью Python - PullRequest
25 голосов
/ 29 июня 2011

Я хочу редактировать XML-файлы, используя python.Я хочу найти и заменить ключевые слова в тегах.В прошлом сотрудник настраивал шаблоны XML-файлов и использовал программу «найти и заменить», чтобы заменить эти ключевые слова.Я хочу использовать python, чтобы найти и заменить эти ключевые слова значениями.Я учил сам модуль Elementtree, но у меня возникли проблемы с поиском и заменой.Я прикрепил кусок моего XML-файла.Вы увидите некоторые переменные, окруженные% (то есть% SITEDESCR%). Это слова, которые я хочу заменить, а затем сохранить XML в новый файл.Любая помощь или предложения будут великолепны.

Спасибо, Майк

<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>

Ответы [ 3 ]

45 голосов
/ 29 июня 2011

Основы:

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)

Вы можете сократить путь, если имя тега уникально.Этот синтаксис находит первый узел на любом уровне глубины в дереве.

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

Также прочтите документацию , особенноподдержка XPath для определения местоположения узлов.

5 голосов
/ 29 июня 2011

Если вы просто хотите заменить биты, заключенные в %, то это не проблема XML. Вы можете легко сделать это с помощью регулярного выражения:

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)
1 голос
/ 29 июня 2011

Просто прочитайте файл за строкой и замените:

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