Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建一个引擎,用python中的json对象替换模板条目_Python_Json_Template Engine - Fatal编程技术网

创建一个引擎,用python中的json对象替换模板条目

创建一个引擎,用python中的json对象替换模板条目,python,json,template-engine,Python,Json,Template Engine,我想用python创建一个引擎,用json中的对象替换模板文件中的标记?我曾经研究过使用正则表达式的基于python的引擎,但是它们太复杂了,我有点困惑于如何开始尝试。任何启动代码都会有帮助 示例json文件 { "webbpage": { "title": "Stackoverflow" }, "Songs": { "name": "Mr Crowley" }, "CoverArtists": [ { "name": "Ozzy", "nicknam

我想用python创建一个引擎,用json中的对象替换模板文件中的标记?我曾经研究过使用正则表达式的基于python的引擎,但是它们太复杂了,我有点困惑于如何开始尝试。任何启动代码都会有帮助

示例json文件

{
  "webbpage": {
    "title": "Stackoverflow"
  },
  "Songs": {
    "name": "Mr Crowley"
  },
  "CoverArtists": [
    { "name": "Ozzy", "nicknames": ["Ozzman","Ozzster"] },
    { "name": "Slipknot", "nicknames": ["Slip"] }
  ]
}
示例模板文件

<html>
  <head>
    <title><%% webbpage.title %%></title>
  </head>
  <body>
    <h1><%% Songs.name %%></h1>
    <%% EACH CoverArtists artist %%>
      <%% artist.name %%>
      <%% EACH CoverArtists.nicknames nickname %%>
        <p><%% nickname %%></p>
      <%% END %%>
    <%% END %%>
  </body>
</html>


基本上,变量在和之间标识,循环在和之间标识,基本上输出html

,因此基本上您需要在
中标识标记。此步骤可通过以下方式完成,例如:

>>重新导入
>>>t=''
>>>重新搜索(r'',t).groups()
(‘Songs.name’,)
解析由此产生的代码是一项相当复杂的任务,您可能会在或中找到一些帮助。即使您需要在整个项目中使用正则表达式,我建议您看看这些以及其他语言的示例,以了解语法解析器是如何工作的

解析语言后,下一步是用json中的值替换标记。最好的方法是首先将数据加载到python dict中,然后编写一个渲染器将数据插入html

即使你不能使用它们,你仍然应该看看一些模板引擎,比如or,并研究它们的源代码,以了解这样一个项目是如何组合在一起的。

查看Alex Mitchells on templating(基于python的),它非常有帮助,还有相关的GIT

基本上

  • 在命令行上获取输入文件

  • 解析模板文件-构建抽象语法树以轻松解析。创建一个节点基类型,然后为每个新类型实现一个具体的类

  • 构建堆栈以跟踪循环,循环关闭时弹出,查找缺少循环结束的错误

  • 解析json文件,构建对象字典,映射AST条目并替换为html

  • 将输出写入文件


  • 我有一个基于Alex mitchells engine的版本,我已经修复了原始版本的一些问题(并将其放入我自己的一些代码中),并且将尝试摆脱基于reg-exp的匹配,并放入上下文匹配,因为正则表达式在大型复杂HTML数据上工作得不太好

    为什么不使用现有的发动机,例如?另外,如果您是用python编写的,那么使用python数据结构不是更有意义吗?我正在尝试学习模板制作,我需要自己编写它来学习模板制作和正则表达式概念的本质。:)请您详细介绍一下python数据结构的使用。谢谢
    >>> import re
    >>> t='<h1><%% Songs.name %%></h1>'
    >>> re.search(r'<%%(.+?)%%>', t).groups()
    (' Songs.name ',)