Вы действительно не нуждаетесь или не хотите использовать для этого внешний подпроцесс.
import fileinput
updateData = "(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=abc)(PORT=1234)))(CONNECT_DATA=(SERVICE_NAME=centraldb)))"
for line in fileinput.input('a.xml', inplace=True):
try:
prefix, tail = line.split('<DB_CONNECT_STRING>', 1)
_, suffix = tail.split('</DB_CONNECT_STRING>', 1)
line = prefix + '<DB_CONNECT_STRING>' + updateData + '</DB_CONNECT_STRING>' + suffix
except ValueError:
# <DB_CONNECT_STRING> or close tag not found -- don't replace
pass
print(line)
Для записи updateData
внутри кавычек волшебным образом не превращается в значение переменной updateData
так что это была еще одна проблема с вашей попыткой.
Специальная обработка XML по-прежнему является серьезной проблемой;правильное решение будет использовать парсер XML и, возможно, XSLT для обновления файла.(С другой стороны, если вы точно знаете, что строка никогда не будет содержать ничего кроме начального и конечного тегов, вы можете несколько упростить приведенный выше сценарий. В-третьих, специальные s-выражения внутри тегов XMLпохоже, что вы действительно хотите переосмыслить формат файла конфигурации более тщательно, если у вас есть хоть какой-то контроль над этим.)