使用get_template jinja2动态生成XML模板

2024-06-16 11:02:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我在Python和XML中都是新手,我使用下面的Python代码和XML文件来替换XML文件中变量的值,并用参数{{param}}中的更新值生成另一个输出XML文件。在

网络会议_有效载荷.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()

模板/桥.xml

^{pr2}$

现在执行命令:python netconf_py.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>

Tags: 文件pyparamoshtmlcontexttemplatexml
2条回答

那么param是一个总是有3个值的列表吗?在这种情况下,我不认为您需要迭代它,而是需要显式地引用列表中的每一项,以获得所需的输出。E、 g

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

您正在循环param,这是一个由3个元素组成的列表:

param = [3, 'ieee', 3]

对于每个值,您将创建3个元素

^{pr2}$

所以你的产出完全是预期的。在

完全移除循环,只需将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>

或者,如果您需要生成多个bridgeId和*可选的和相应的bridgeType标记,也许您需要一个字典列表

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

注意,第二个字典在这里没有'type'键。然后渲染变成:

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

相关问题 更多 >