Найти и заменить значения в XML с помощью Python

19

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

Спасибо, 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>
    
задан Mike 29.06.2011 в 18:18
источник
  • +1 в XML-парсер. Мне нравится lxml. easy_install lxml –  matchew 29.06.2011 в 18:21
  • возможный дубликат XML-парсеров Best Cross Platform для Python –  Andreas Jung 29.06.2011 в 18:22
  • Спасибо за ответ. Я довольно новичок в python, совершенно новый для XML, и это мой первый пост в Stack. Иногда задавать правильный вопрос сложнее, чем найти правильный ответ. –  Mike 29.06.2011 в 18:47
  • Вы также захотите ознакомиться с xpath, это язык запросов для XML. Не беспокойтесь, вы можете получить здесь большую помощь здесь. –  MattH 29.06.2011 в 22:55

3 ответа

31

Основы:

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 для размещения узлов.

    
ответ дан Mark Tolonen 29.06.2011 в 18:33
источник
  • Эй, спасибо Марк. Это именно то, что я искал. Это работает с моей exsiting программой python. –  Mike 29.06.2011 в 18:41
2

Если вы просто хотите заменить биты, заключенные в % , то это не проблема 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)
    
ответ дан Ismail Badawi 29.06.2011 в 18:25
источник
  • Я тестировал это в автономном скрипте, и это хорошо работает. Я добавлю это в свою библиотеку python для дальнейшего использования. Спасибо, что ответили. –  Mike 29.06.2011 в 18:40
0

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

for line in open(template_file_name,'r'):
  output_line = line
  output_line = string.replace(output_line, placeholder, value)
  print output_line 
    
ответ дан Rostislav Matl 29.06.2011 в 18:25
источник
  • Это тоже работает! Я ценю положительную обратную связь! –  Mike 29.06.2011 в 18:44
  • Это может быть хрупким - файлы XML - это не просто текст. Пробелы, как правило, не важны в XML, поэтому изменение входного файла может привести к идентичному XML, который ваш код не распознает. –  Rodney Richardson 09.01.2018 в 16:30
  • пробелов в% something% нет, я бы добавил только специальные символы XML, например особенно <и>, если это необходимо –  Rostislav Matl 18.01.2018 в 12:40