繁体   English   中英

在python中模板化xml文件的快捷方法

[英]fast and easy way to template xml files in python

现在我已经在我的python脚本中硬编码了整个xml文件,只是做了out.write(),但是现在它变得越来越难以管理,因为我有多种类型的xml文件。

设置模板的最简单,最快捷的方法是什么,以便我可以给变量名称amd filename?

轻量级选项是xml.dom.minidom

xml.dom.minidom是文档对象模型接口的轻量级实现。 它旨在比完整的DOM更简单,也更小。

您可以使用xml.dom API创建DOM对象,例如DOM Element对象 ,并使用Node.writexml生成XML。 请注意,这需要构建DOM层次结构,这可能不是您所追求的。

更多pythonic选项是ElementTree

Element类型是一个灵活的容器对象,旨在将分层数据结构存储在内存中。 该类型可以描述为列表和字典之间的交叉。

ElementTree对象在Python中更容易创建和处理,并且可以使用ElementTree.dump()ElementTree.tostring()序列化为XML

两个选择。

  1. 模板工具,例如Jinja2

  2. 构建DOM对象。 没有听起来那么糟糕。 ElementTree有一个令人愉快的工厂,用于构建XML标签和创建必要的结构。

简短的回答是:您应该关注和处理数据(即python对象)而不是原始XML

基本故事: XML应该是某些数据或数据集的表示。 关于数据类型,代表什么等等,你的问题中没有很多细节 - 所以我会给你一些基本的答案。

Python选择: BeautifulSoup,lxml和其他python库(ElementTree等),使得处理XML更加容易。 与我试图直接使用原始格式的XML相比,它们让我更容易读入或写出XML数据。

在这两个(输入,输出)活动的中间,我的python程序正在处理一个很好的python对象或我可以走的某种解析树。 您可以读取数据,从该字符串创建对象,操作它并写出XML。

其他选择,模板:好的 - 也许您喜欢XML并且只想“模板化”它以便您可以使用数据填充它。

如果您没有真正操纵数据,那么您可能会对此感到更舒服 - 但只是将其表示为输出。 而且,这类似于您当前使用的XML字符串 - 因此可能更为熟悉。

使用Cheetah,Jinja或其他模板库来提供帮助。 使用该模板语言为XML文件创建模板。

例如,您只需从文件或数据库表中读取书籍列表。 您可以使用模板将此书对象列表传递给模板引擎,然后告诉它写出您的XML输出。

这些图书对象的示例模板:

<?xml version="1.0"?>
<catalog>
   {% for object in object_list %}
   <book id="{{ object.bookID }}">
      <author>{{ object.author_name }}</author>
      <title>{{ object.title }}</title>
      <genre>{{ object.genre }}</genre>
      <price>{{ object.price }}</price>
      <publish_date>{{ object.pub_date }}</publish_date>
      <description>{{ object.description }}</description>
   </book>
   {% endfor %}
 </catalog>
 </xml>

模板引擎将遍历“object_list”并输出包含所有书籍的长XML文件。 这比存储原始XML字符串好得多,就像你现在一样。

这使得XML显示的更新和修改与数据,数据存储和数据操作分开 - 使您的生活更轻松。

如果你想要一些非常简单和轻巧的东西,我的古代YAPTU和Palmer的yaptoo变种应该是可用的 - 但是现在有许多其他通用和强大的模板引擎可供选择。 这里有一个非常完整的清单。

你要求最简单,最快,所以请看这篇文章: http//blog.simonwillison.net/post/58096201893/simpletemplates

如果你想要更聪明的东西,请看看这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM