XML 是一種可移植的開源語言,它允許程序員開發可由其他應用程序讀取的應用程序,而不管操作系統和/或開發語言如何。
什么是 XML?
可擴展標記語言 (XML) 是一種與 HTML 或 SGML 非常相似的標記語言。這是萬維網聯盟推薦的,可作為開放標準使用。
XML 對于跟蹤中小型數據量非常有用,無需基于 SQL 的主干。
XML 解析器架構和 API
Python 標準庫提供了一組最小但有用的接口來處理 XML。
XML 數據的兩個最基本和最廣泛使用的 API 是 SAX 和 DOM 接口。
Simple API for XML (SAX) - 在這里,您為感興趣的事件注冊回調,然后讓解析器繼續處理文檔。當您的文檔很大或您有內存限制時,這很有用,它會在從磁盤讀取文件時解析文件,并且整個文件永遠不會存儲在內存中。
文檔對象模型 (DOM) API - 這是萬維網聯盟的建議,其中將整個文件讀入內存并以分層(基于樹的)形式存儲,以表示 XML 文檔的所有特征。
在處理大文件時,SAX 顯然無法像 DOM 那樣快速處理信息。另一方面,僅使用 DOM 確實會殺死您的資源,尤其是在大量小文件上使用時。
SAX 是只讀的,而 DOM 允許更改 XML 文件。由于這兩個不同的 API 實際上是相互補充的,所以沒有理由不能將它們都用于大型項目。
對于我們所有的 XML 代碼示例,讓我們使用一個簡單的 XML 文件movies.xml作為輸入 -
<collection shelf="New Arrivals">
<movie title="Enemy Behind">
<type>War, Thriller</type>
<format>DVD</format>
<year>2003</year>
<rating>PG</rating>
<stars>10</stars>
<description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
<type>Anime, Science Fiction</type>
<format>DVD</format>
<year>1989</year>
<rating>R</rating>
<stars>8</stars>
<description>A schientific fiction</description>
</movie>
<movie title="Trigun">
<type>Anime, Action</type>
<format>DVD</format>
<episodes>4</episodes>
<rating>PG</rating>
<stars>10</stars>
<description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
<type>Comedy</type>
<format>VHS</format>
<rating>PG</rating>
<stars>2</stars>
<description>Viewable boredom</description>
</movie>
</collection>
使用 SAX API 解析 XML
SAX 是事件驅動的 XML 解析的標準接口。使用 SAX 解析 XML 通常需要您通過子類化 xml.sax.ContentHandler 創建自己的 ContentHandler。
您的ContentHandler處理您的 XML 風格的特定標簽和屬性。ContentHandler 對象提供了處理各種解析事件的方法。它擁有的解析器在解析 XML 文件時調用 ContentHandler 方法。
在 XML 文件的開頭和結尾調用方法startDocument和endDocument 。方法characters(text)通過參數text 傳遞XML 文件的字符數據。
ContentHandler 在每個元素的開始和結束處被調用。如果解析器不處于命名空間模式,則調用方法startElement(tag, attributes)和endElement(tag);否則,調用相應的方法startElementNS和endElementNS。這里,tag 是元素標簽,attributes 是一個 Attributes 對象。
以下是在繼續之前要了解的其他重要方法 -
make_parser方法_
以下方法創建一個新的解析器對象并返回它。創建的解析器對象將是系統找到的第一個解析器類型。
xml.sax.make_parser( [parser_list] )
這是參數的詳細信息 -
parser_list - 可選參數,由要使用的解析器列表組成,這些解析器必須全部實現 make_parser 方法。
解析方法_
以下方法創建一個 SAX 解析器并使用它來解析文檔。
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
這是參數的詳細信息 -
xmlfile - 這是要讀取的 XML 文件的名稱。
contenthandler - 這必須是一個 ContentHandler 對象。
errorhandler - 如果指定,errorhandler 必須是 SAX ErrorHandler 對象。
parseString方法_
還有另一種方法可以創建 SAX 解析器并解析指定的XML 字符串。
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
這是參數的詳細信息 -
xmlstring - 這是要讀取的 XML 字符串的名稱。
contenthandler - 這必須是一個 ContentHandler 對象。
errorhandler - 如果指定,errorhandler 必須是 SAX ErrorHandler 對象。
例子
#!/usr/bin/python
import xml.sax
class MovieHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.type = ""
self.format = ""
self.year = ""
self.rating = ""
self.stars = ""
self.description = ""
# Call when an element starts
def startElement(self, tag, attributes):
self.CurrentData = tag
if tag == "movie":
print "*****Movie*****"
title = attributes["title"]
print "Title:", title
# Call when an elements ends
def endElement(self, tag):
if self.CurrentData == "type":
print "Type:", self.type
elif self.CurrentData == "format":
print "Format:", self.format
elif self.CurrentData == "year":
print "Year:", self.year
elif self.CurrentData == "rating":
print "Rating:", self.rating
elif self.CurrentData == "stars":
print "Stars:", self.stars
elif self.CurrentData == "description":
print "Description:", self.description
self.CurrentData = ""
# Call when a character is read
def characters(self, content):
if self.CurrentData == "type":
self.type = content
elif self.CurrentData == "format":
self.format = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "rating":
self.rating = content
elif self.CurrentData == "stars":
self.stars = content
elif self.CurrentData == "description":
self.description = content
if ( __name__ == "__main__"):
# create an XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
# override the default ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )
parser.parse("movies.xml")
這將產生以下結果 -
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Stars: 10
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
Description: Viewable boredom
有關 SAX API 文檔的完整詳細信息,請參閱標準Python SAX API。
使用 DOM API 解析 XML
文檔對象模型 (“DOM”) 是萬維網聯盟 (W3C) 的跨語言 API,用于訪問和修改 XML 文檔。
DOM 對于隨機訪問應用程序非常有用。SAX 一次只允許您查看文檔的一個位。如果您正在查看一個 SAX 元素,則無法訪問另一個元素。
這是快速加載 XML 文檔和使用 xml.dom 模塊創建 minidom 對象的最簡單方法。minidom 對象提供了一個簡單的解析器方法,可以從 XML 文件快速創建一個 DOM 樹。
樣例語句調用minidom對象的parse(file[,parser])函數,將file指定的XML文件解析成DOM樹對象。
#!/usr/bin/python
from xml.dom.minidom import parse
import xml.dom.minidom
# Open XML document using minidom parser
DOMTree = xml.dom.minidom.parse("movies.xml")
collection = DOMTree.documentElement
if collection.hasAttribute("shelf"):
print "Root element : %s" % collection.getAttribute("shelf")
# Get all the movies in the collection
movies = collection.getElementsByTagName("movie")
# Print detail of each movie.
for movie in movies:
print "*****Movie*****"
if movie.hasAttribute("title"):
print "Title: %s" % movie.getAttribute("title")
type = movie.getElementsByTagName('type')[0]
print "Type: %s" % type.childNodes[0].data
format = movie.getElementsByTagName('format')[0]
print "Format: %s" % format.childNodes[0].data
rating = movie.getElementsByTagName('rating')[0]
print "Rating: %s" % rating.childNodes[0].data
description = movie.getElementsByTagName('description')[0]
print "Description: %s" % description.childNodes[0].data
這將產生以下結果 -
Root element : New Arrivals
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Rating: PG
Description: Talk about a US-Japan war
*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Rating: R
Description: A schientific fiction
*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Rating: PG
Description: Vash the Stampede!
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description: Viewable boredom
有關 DOM API 文檔的完整詳細信息,請參閱標準Python DOM API