【问题标题】:fast and easy way to template xml files in python在 python 中模板化 xml 文件的快速简便的方法
【发布时间】:2009-06-28 15:28:44
【问题描述】:

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

设置模板的最简单快捷的方法是什么,以便我可以只给出变量名和文件名?

【问题讨论】:

    标签: python xml


    【解决方案1】:

    简短的回答是:您应该关注和处理数据(即 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 显示的更新和修改与数据、数据存储和数据操作分开 - 让您的生活更轻松。

    【讨论】:

      【解决方案2】:

      两个选择。

      1. 模板工具,例如Jinja2

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

      【讨论】:

        【解决方案3】:

        轻量级选项是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

        【讨论】:

          【解决方案4】:

          您要求的是最简单和最快的,请参阅此帖子:http://blog.simonwillison.net/post/58096201893/simpletemplates

          如果您想要更智能的东西,请查看here

          【讨论】:

          • 简单方法的问题在于它太简单了:它会在包含的文本第一次包含与号时中断,这不是一些疯狂的百万分之一的边缘情况。
          【解决方案5】:

          如果你想要一些非常简单和轻量级的东西,我古老的 YAPTU 和 Palmer 的 yaptoo 变体应该是可用的 - 但是现在有很多很多其他通用和强大的模板引擎可供选择。一个相当完整的列表是here

          【讨论】:

            猜你喜欢
            • 2019-07-29
            • 1970-01-01
            • 2018-03-02
            • 1970-01-01
            • 2010-09-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-03-29
            相关资源
            最近更新 更多