Удаление и добавление элементов в сообщение FIXML

Очень новичок в Python. Мы разрабатываем тестовый инструмент для создания тестовых сообщений FIXML из данных компонентов, захваченных в формате XML. Мы должны использовать ElementTree/Python 2.7.

Принцип состоит в том, чтобы загрузить базовый шаблон сообщения (в этом случае сообщение содержит информацию, не относящуюся к бизнес-заголовку и т. д.), и обогатить его, заменив определенные целые элементы подэлементами/атрибутами, но с конкретным бизнес-контентом (например, продукт детали, детали вечеринки и т. д.), поэтому мы можем создавать варианты сделок, используя несколько шаблонов.

Пример XML выглядит следующим образом:

<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="" MMY="" />
  <Stats Typ="" Px="" Tm="" Sz="" />
  <TrdMtchSide TrdID="" Side="" SideQty="">
   <TrdRptOrdDetl OrdID="" ClOrdID="" ClOrdID2="">
    <OrdQty Qty="" />
   </TrdRptOrdDetl>
  </TrdMtchSide>
 </InstrmtMtchSide>
</TrdMtchRpt>

В этом случае цель состоит в том, чтобы проанализировать базовый файл с помощью etree, а затем заменить элемент «InstrmtMtchSide» другим элементом.

Может кто-нибудь дать мне несколько советов о том, как это можно выполнить с помощью ElementTree?


person Nick H    schedule 13.02.2012    source источник


Ответы (1)


Вместо того, чтобы использовать документ в качестве шаблона и обновлять некоторые элементы в зависимости от доставляемого сообщения, я бы посоветовал использовать систему шаблонов.

Например, с 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>
person jcollado    schedule 13.02.2012
comment
Привет @jcollado, спасибо за ответ. К сожалению, было принято решение использовать этот подход с заменой нескольких шаблонов и конкретных элементов без жесткого кодирования, поскольку у нас есть большое количество типов сообщений, которые необходимо учитывать. Тем не менее, я рассмотрю ваши рекомендации для систем шаблонов. Спасибо и с уважением, Ник Х. - person Nick H; 13.02.2012