2016-07-18 3 views
-1

私はPythonとXMLで新しく、以下のpythonコードとxmlファイルを使用してxmlファイルの変数の値を置き換え、別の出力xmlファイルを生成します。パラメータ{{param}}get_templateを使用した動的なXMLテンプレートの生成

netconf_payload.py

#!/usr/bin/env python 
import os 
from jinja2 import Environment, FileSystemLoader 
PATH = os.path.dirname(os.path.abspath(__file__)) 
TEMPLATE_ENVIRONMENT = Environment(
    autoescape=False, 
    loader=FileSystemLoader(os.path.join(PATH, 'templates')), 
    trim_blocks=False) 
def render_template(template_filename, context): 
    return TEMPLATE_ENVIRONMENT.get_template(template_filename).render(context) 
def create_index_html(): 
    fname = "bridge.xml" 
    param = [3, 'ieee', 3] 
    context = { 
     'param': param 
    } 
    # 
    with open(fname, 'w') as f: 
     html = render_template('bridge.xml', context) 
     f.write(html) 
def main(): 
    create_index_html() 
if __name__ == "__main__": 
    main() 

テンプレート/ bridge.xml

<vr> 
     <vrId>0</vrId> 
     <bridge> 
     {% set counter = 0 -%} 
     {% for param in param -%} 
       <bridgeId>{{ param }}</bridgeId> 
       <bridgeType>{{ param }}</bridgeType> 
       <bridgeId>{{ param }}</bridgeId> 
     {% set counter = counter + 1 -%} 
     {% endfor -%} 
     </bridge> 
</vr> 

は今のコマンドを実行します。のpython netconf_payload.py それは出力ブリッジが生成されます。 xmlファイルは次のとおりです。

<vr> 
     <vrId>0</vrId> 
     <bridge> 
     <bridgeId>3</bridgeId> 
       <bridgeType>3</bridgeType> 
       <bridgeId>3</bridgeId> 
     <bridgeId>ieee</bridgeId> 
       <bridgeType>ieee</bridgeType> 
       <bridgeId>ieee</bridgeId> 
     <bridgeId>3</bridgeId> 
       <bridgeType>3</bridgeType> 
       <bridgeId>3</bridgeId> 
     </bridge> 
</vr> 

私が欲しい予想される出力は次のようになります。

<vr> 
     <vrId>0</vrId> 
     <bridge> 
       <bridgeId>3</bridgeId> 
       <bridgeType>ieee</bridgeType> 
       <bridgeId>3</bridgeId> 
     </bridge> 
</vr> 

答えて

0

のでparamは常に3つの値を持つリストのですか?私はあなたがこの場合反復したいとは思わない、代わりにあなたが望む出力を得るためにリストの各項目を明示的に参照する必要があると思う。例えば。

<bridge> 
    <bridgeId>{{ param[0] }}</bridgeId> 
    <bridgeType>{{ param[1] }}</bridgeType> 
    <bridgeId>{{ param[2] }}</bridgeId> 
</bridge> 
+0

おかげでスティーブ...その作業 – Rajendra

0

あなたは3つの要素のリストである、paramをループされています。これらの値のそれぞれについて

param = [3, 'ieee', 3] 

、あなたは3要素作成:

{% for param in param -%} 
     <bridgeId>{{ param }}</bridgeId> 
     <bridgeType>{{ param }}</bridgeType> 
     <bridgeId>{{ param }}</bridgeId> 
{% endfor -%} 

をので、あなたの出力は完全に期待されます。

完全にループを削除し、ちょうど3つの別々のタグに3つの要素を挿入します。

:あなたは、おそらくそれはあなたが3つの要素に名前を付けることができますよう、代わりしかし 辞書を使用したい

<vr> 
     <vrId>0</vrId> 
     <bridge> 
       <bridgeId>{{ param[0] }}</bridgeId> 
       <bridgeType>{{ param[1] }}</bridgeType> 
       <bridgeId>{{ param[2] }}</bridgeId> 
     </bridge> 
</vr> 

param = {'id1': 3, 'type': 'ieee', 'id2': 3} 

<vr> 
     <vrId>0</vrId> 
     <bridge> 
       <bridgeId>{{ param.id1 }}</bridgeId> 
       <bridgeType>{{ param.type }}</bridgeType> 
       <bridgeId>{{ param.id2 }}</bridgeId> 
     </bridge> 
</vr> 

か第二の辞書はここには'type'キーを持っていないことを

param = [{'id1': 3, 'type': 'ieee'}, {'id2': 3}] 

注意:複数のbridgeIdと*オプションと対応するbridgeTypeタグを生成するために必要であれば、おそらくあなたは辞書のリストが欲しいです。レンダリング後、次のようになります。

<vr> 
    <vrId>0</vrId> 
    <bridge> 
    {% for entry in param -%} 
     <bridgeId>{{ entry.id }}</bridgeId> 
     {% if entry.type %}<bridgeType>{{ entry.type }}</bridgeType>{% endif %} 
    {% endfor -%} 
    </bridge> 
</vr> 
+0

うんMatijn ...の提案に感謝 - もっと役に立つことと私のためにソートされます使用してdictのは.... – Rajendra

+0

もう一つ質問してください:私ができます実行時にすべてのパラメータ "param = [3、 'ieee'、3]を渡しますか? – Rajendra

+0

@Rajendra:あなたは他の情報に基づいて 'param'リストを構築することを意味しますか?もちろん、そうしてください。それはちょっと別のプログラミング上の問題です。 –

関連する問題