簡體   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