Вместо использования документа в качестве шаблона и обновления некоторых элементов в зависимости от доставляемого сообщения, я бы посоветовал использовать систему шаблонов.
Например, с jinja2 можно использовать следующим образом:
from jinja2 import Template
template_str = """
<TrdMtchRpt TrdID="$+" RptTyp="0" TrdDt="$date" MtchTyp="4" LastMkt="ABCD" LastPx="123.45">
<Hdr SID="GTS" TID="Somewhere" Snt="$timestamp" />
<ApplSeqCtrl ApplID="D" ApplSeqNum="$appseqnum" />
<InstrmtMtchSide>
<Instrmt Sym="{{ sym }}" MMY="{{ mmy }}" />
</InstrmtMtchSide>
</TrdMtchRpt>
"""
template = Template(template_str)
print template.render(sym='aaa', mmy='bbb')
Пример вывода:
<TrdMtchRpt TrdID="$+" RptTyp="0" TrdDt="$date" MtchTyp="4" LastMkt="ABCD" LastPx="123.45">
<Hdr SID="GTS" TID="Somewhere" Snt="$timestamp" />
<ApplSeqCtrl ApplID="D" ApplSeqNum="$appseqnum" />
<InstrmtMtchSide>
<Instrmt Sym="aaa" MMY="bbb" />
</InstrmtMtchSide>
</TrdMtchRpt>
Примечание. Существует множество других систем шаблонов, таких как mako , django-template или genshi .
Редактировать: Если вы действительно хотите программно сгенерировать новый XML-документ, приведенный ниже пример кода заменяет InstrmtMtchSide
на NewElement
:
from xml.etree import ElementTree as etree
tree = etree.parse(xml_filename)
root = tree.getroot()
element = root.find('InstrmtMtchSide')
root.remove(element)
etree.SubElement(root, 'NewElement')
print etree.tostring(root)
Пример вывода:
<TrdMtchRpt LastMkt="ABCD" LastPx="123.45" MtchTyp="4" RptTyp="0" TrdDt="$date" TrdID="$+">
<Hdr SID="GTS" Snt="$timestamp" TID="Somewhere" />
<ApplSeqCtrl ApplID="D" ApplSeqNum="$appseqnum" />
<NewElement /></TrdMtchRpt>