在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来实现这个的指导呢?
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>
注意:还有很多其他的模板系统,比如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>