删除和附加FIXML消息中的元素



Python非常新。我们正在开发一个测试工具,从以XML格式捕获的组件数据中生成测试FIXML消息。我们必须使用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执行此操作的指导吗?

我建议使用模板系统,而不是使用文档作为模板并根据要传递的消息更新一些元素。

例如,与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>

相关内容

最新更新