Python 資料持久化 - XML 解析器



XML 是 **可擴充套件標記語言** 的縮寫。它是一種可移植的、開源的、跨平臺的語言,非常類似於 HTML 或 SGML,並得到全球資訊網聯盟的推薦。

它是一種眾所周知的的資料交換格式,被大量應用程式使用,例如 Web 服務、辦公工具和 **面向服務的架構** (SOA)。XML 格式既可由機器讀取,也可由人類讀取。

標準 Python 庫的 xml 包包含以下用於 XML 處理的模組:

序號 模組及描述
1

xml.etree.ElementTree

ElementTree API,一個簡單輕量的 XML 處理器

2

xml.dom

DOM API 定義

3

xml.dom.minidom

一個最小的 DOM 實現

4

xml.sax

SAX2 介面實現

5

xml.parsers.expat

Expat 解析器繫結

XML 文件中的資料以樹狀的層次結構格式排列,從根節點和元素開始。每個元素都是樹中的一個節點,並且具有包含在 <> 和 </> 標記中的屬性。可以為每個元素分配一個或多個子元素。

以下是一個典型的 XML 文件示例:

<?xml version = "1.0" encoding = "iso-8859-1"?>
<studentlist>
   <student>
      <name>Ratna</name>
      <subject>Physics</subject>
      <marks>85</marks>
   </student>
   <student>
      <name>Kiran</name>
      <subject>Maths</subject>
      <marks>100</marks>
   </student>
   <student>
      <name>Mohit</name>
      <subject>Biology</subject>
      <marks>92</marks>
   </student>
</studentlist>

在使用 **ElementTree** 模組時,第一步是設定樹的根元素。每個元素都有一個標籤和一個 attrib,它是一個字典物件。對於根元素,attrib 是一個空字典。

import xml.etree.ElementTree as xmlobj
root=xmlobj.Element('studentList')

現在,我們可以在根元素下新增一個或多個元素。每個元素物件可能具有 **子元素**。每個子元素都有一個屬性和一個文字屬性。

student=xmlobj.Element('student')
   nm=xmlobj.SubElement(student, 'name')
   nm.text='name'
   subject=xmlobj.SubElement(student, 'subject')
   nm.text='Ratna'
   subject.text='Physics'
   marks=xmlobj.SubElement(student, 'marks')
   marks.text='85'

這個新元素使用 append() 方法附加到根元素。

root.append(student)

使用上述方法追加任意數量的元素。最後,根元素物件被寫入檔案。

tree = xmlobj.ElementTree(root)
   file = open('studentlist.xml','wb')
   tree.write(file)
   file.close()

現在,我們來看看如何解析 XML 檔案。為此,在 ElementTree 建構函式中,以檔案引數的形式提供檔名來構建文件樹。

tree = xmlobj.ElementTree(file='studentlist.xml')

樹物件具有 **getroot()** 方法來獲取根元素,getchildren() 返回其下方的元素列表。

root = tree.getroot()
children = root.getchildren()

透過迭代每個子節點的子元素集合,構建與每個子元素對應的字典物件。

for child in children:
   student={}
   pairs = child.getchildren()
   for pair in pairs:
      product[pair.tag]=pair.text

然後將每個字典追加到一個列表中,返回原始的字典物件列表。

**SAX** 是一個用於事件驅動的 XML 解析的標準介面。使用 SAX 解析 XML 需要透過繼承 xml.sax.ContentHandler 來建立內容處理器。您為感興趣的事件註冊回撥,然後讓解析器遍歷文件。

當您的文件很大或記憶體有限時,SAX 很有用,因為它在從磁碟讀取檔案時解析檔案,因此整個檔案永遠不會儲存在記憶體中。

文件物件模型

(DOM) API 是全球資訊網聯盟的一項推薦。在這種情況下,整個檔案被讀入記憶體並存儲在層次結構(基於樹)的形式中,以表示 XML 文件的所有特性。

對於大型檔案,SAX 的速度不如 DOM。另一方面,如果在許多小檔案上使用 DOM,它可能會消耗大量資源。SAX 是隻讀的,而 DOM 允許更改 XML 檔案。

廣告