2016-09-20 48 views
0

我有一个用作模板的xml文件。 我有这个XML中的多个标记将被实际数据替换。这是我做过什么:
通过标记字符串替换多个文本

def populate_template(self, value1, value2, value3): 
     with open('my_template.xml', 'rb') as xml_template: 
      template_string = xml_template.read() 

     template_string.replace('{{MARKER_1}}', value1) 
     template_string.replace('{{MARKER_2}}', value2) 
     template_string.replace('{{MARKER_3}}', value3) 
     return template_string 

每个标记可以出现多次的模板中。
我想知道是否有更有效的方法来做到这一点?
高科技的东西:

  • 的Python 2.7

回答

1

是。使用jinja2模板模块。要使用现有的模板,你可以做这样的事情:

def populate_template(self, value1, value2, value3): 
    from jinja2 import Template 
    t = Template(open('my_template.xml', 'r').read()) 
    output = t.render(MARKER_1=value2, MARKER_2=value2, MARKER_3=value3) 
    return output 

这是很值得研究的不同的方法可以将参数传递给模板,也。例如,同样的代码可能已被写成...

... 
    context = {'MARKER_1': value1, 'MARKER_2', value2, 'MARKER_3': value3} 
    output = t.render(**context) 

,你可以使用这一招你碰巧躺在附近的任何旧类型的字典。这是选择性地从字典中提取可读信息的好方法。

jinja2的设计者,作为对Python原因有同情心的智能饼干,实际上帮助你通过允许你以任何方式提供上下文,你可以创建一个字典(关键字参数,元组列表或(key, value)元组或一个字典 - 包括其他类似字典的东西,如collections.OrderedDict)。所以你也可以写第二行为

output = t.render(context) 

这是更具可读性和更高效(我猜,但它是一个明智的猜测)。

+0

谢谢。我改变了你的代码,使用'Environment#get_template'方法来获取模板,它的效果很好。谢谢! –