【问题标题】:Removing and appending elements in a FIXML message删除和附加 FIXML 消息中的元素
【发布时间】:2012-02-13 14:46:48
【问题描述】:

对 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 执行此操作的指导吗?

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

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

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

    【讨论】:

    • 嗨@jcollado,感谢您的回复。不幸的是,我们决定使用这种多模板和特定元素替换方法,无需硬编码,因为我们需要处理大量消息类型。尽管如此,我还是会看看您对模板系统的建议。谢谢和问候,尼克 H。
    猜你喜欢
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2011-07-20
    • 1970-01-01
    • 2010-12-11
    相关资源
    最近更新 更多