在FIXML消息中移除和追加元素

1 投票
1 回答
561 浏览
提问于 2025-04-17 12:57

我刚开始学习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来实现这个的指导呢?

1 个回答

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-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>

撰写回答