【发布时间】:2009-06-28 15:28:44
【问题描述】:
现在我已经在我的 python 脚本中对整个 xml 文件进行了硬编码,并且只是在执行 out.write(),但现在它变得越来越难以管理,因为我有多种类型的 xml 文件。
设置模板的最简单快捷的方法是什么,以便我可以只给出变量名和文件名?
【问题讨论】:
现在我已经在我的 python 脚本中对整个 xml 文件进行了硬编码,并且只是在执行 out.write(),但现在它变得越来越难以管理,因为我有多种类型的 xml 文件。
设置模板的最简单快捷的方法是什么,以便我可以只给出变量名和文件名?
【问题讨论】:
简短的回答是:您应该关注和处理数据(即 python 对象)而不是原始 XML
基本故事: XML 应该是一些数据或数据集的表示。 您的问题中没有太多关于数据类型、它所代表的内容等的详细信息,所以我会给您一些基本的答案。
Python 选择: BeautifulSoup、lxml 和其他 python 库(ElementTree 等),使处理 XML 更加容易。它们让我读入或写出 XML 数据比我尝试直接使用原始格式的 XML 要容易得多。
在这 2 个(输入、输出)活动的中间,我的 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 显示的更新和修改与数据、数据存储和数据操作分开 - 让您的生活更轻松。
【讨论】:
两个选择。
模板工具,例如Jinja2。
构建 DOM 对象。没有听起来那么糟糕。 ElementTree 有一个令人愉快的工厂,用于构建 XML 标记和创建必要的结构。
【讨论】:
轻量级选项是xml.dom.minidom
xml.dom.minidom 是文档对象模型接口的轻量级实现。它旨在比完整的 DOM 更简单,而且要小得多。
您可以使用xml.dom API 创建DOM 对象,例如DOM Element objects,并使用Node.writexml 生成XML。请注意,这需要构建 DOM 层次结构,这可能不是您所追求的。
更多pythonic选项是ElementTree。
Element 类型是一个灵活的容器对象,旨在将分层数据结构存储在内存中。该类型可以描述为列表和字典的混合体。
ElementTree 对象在Python 中更容易创建和处理,并且可以使用ElementTree.dump() 或ElementTree.tostring() 序列化为XML
【讨论】:
您要求的是最简单和最快的,请参阅此帖子:http://blog.simonwillison.net/post/58096201893/simpletemplates
如果您想要更智能的东西,请查看here。
【讨论】: