2012-02-13 1 views
1

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

Директор должен загрузить базовый шаблон сообщения (в этом случае 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?

ответ

0

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

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

Edit: Если вы действительно хотите, чтобы программно создать новый 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> 
+0

Hi @jcollado, Спасибо за ответ. К сожалению, было принято решение использовать этот подход для замены нескольких шаблонов и конкретных элементов без жесткого кодирования, поскольку у нас есть большое количество типов сообщений для учета. Тем не менее я рассмотрю ваши рекомендации по шаблонам. Спасибо и приветствую, Ник Х. –