2012-02-13 18 views
1

Pythonには新しく追加されました。私たちは、XML形式でキャプチャされたコンポーネントデータからテストFIXMLメッセージを生成するためのテストツールを開発しています。 ElementTree/Python 2.7を使う必要があります。FIXMLメッセージ内の要素の削除と追加

メッセージの基本テンプレート(この場合はmsgにはビジネス以外のヘッダー情報などが含まれます)をロードし、特定の要素全体をサブ要素/属性に置き換えて特定のビジネスコンテンツ(製品の詳細、パーティーの詳細など)、少数のテンプレートを使用してさまざまな取引を生成することができます。

XMLの例以下の通りである:この場合の目的は、相互にそれと「InstrmtMtchSide」要素を置き換え、その後etreeを使用して、ベースファイルを解析することである

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

ElementTreeを使用してこれを実行する方法についてのガイダンスを教えてください。

答えて

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ドキュメントを生成する場合は、次のコードは一例です置き換えNewElement 1とInstrmtMtchSide

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

こんにちは@jcollado、返事をありがとう。残念なことに、このマルチテンプレートと特定の要素置換アプローチをハードコードなしで使用することが決定されました。それにもかかわらず、テンプレートシステムの推奨事項を見ていきます。ありがとうと、ニックH. –

関連する問題