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

时间:2012-02-13 14:46:48

标签: python xml elementtree

Python的新手。我们正在开发一种测试工具,用于以XML格式捕获的组件数据生成测试FIXML消息。我们必须使用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 :(得分: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>

注意:还有许多其他模板系统,例如makodjango-templategenshi

编辑:如果您确实想以编程方式生成新的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>