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执行此操作的指导吗?
答案 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>
注意:还有许多其他模板系统,例如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>