Удаление и добавление элементов в сообщении FIXML - PullRequest
1 голос
/ 13 февраля 2012

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

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

Пример 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?

1 Ответ

0 голосов
/ 13 февраля 2012

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

Например, с 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>
...