XML 指可擴展標記語言,標準通用標記語言的子集,是一種用於標記電子文件使其具備結構性的標記語言。python
XML 被設計用來傳輸和存儲數據。XML適用於跟蹤中小型數據而無需基於SQL的主幹。編程
常見的 XML 編程接口有 DOM 和 SAX,這兩種接口處理 XML 文件的方式不一樣,使用場景也不一樣。dom
Python有三種方法解析XML,分別是SAX、DOM和ElementTree:函數
因DOM須要將XML數據映射到內存中的樹,會比較慢和消耗內存,而SAX流式讀取XML文件,比較快,佔用內存少,但須要用戶實現回調函數(handler)。
本章節使用到的 XML 實例文件movies.xml內容以下:spa
<collection shelf="新品推薦"> <movie title="重返二十歲"> <type>喜劇,親情,愛情,奇幻</type> <format>DVD</format> <year>2014</year> <rating>PG</rating> <stars>8</stars> <description>影片講述了一位七旬老太太難以想象變身爲妙齡女子後,以新身份回到平常生活,引起的一系列哭笑不得的奇幻故事</description> </movie> <movie title="流浪地球"> <type>科幻、災難、冒險、動做</type> <format>DVD</format> <year>2019</year> <rating>R</rating> <stars>10</stars> <description>講述了太陽即將毀滅,已經不適合人類生存,而面對絕境,人類將開啓「流浪地球」計劃 </description> </movie> <movie title="惡棍天使"> <type>喜劇,愛情</type> <format>DVD</format> <year>2015</year> <rating>PG</rating> <stars>10</stars> <description>講述了高智商低情商女學霸查小刀遇到專職替人討債的惡棍莫非裏,倆人在神醫折耳根的介紹下互相「治療」發生的一系列故事</description> </movie> <movie title="戰狼"> <type>動做,戰爭,軍事</type> <format>VHS</format> <year>2015</year> <rating>PG</rating> <stars>10</stars> <description>講述的是小人物成長爲拯救國家和民族命運的孤膽英雄的傳奇故事</description> </movie> </collection>
SAX 是一種基於事件驅動的API。利用 SAX 解析 XML 文檔牽涉到兩個部分,解析器和事件處理器。解析器負責讀取 XML 文檔,並向事件處理器發送事件,如元素開始跟元素結束事件。而事件處理器則負責對事件做出響應,對傳遞的 XML 數據進行處理。設計
在 Python 中使用 sax 方式處理 xml 要先引入 xml.sax 中的 parse 函數,還有 xml.sax.handler 中的 ContentHandler。code
characters(content)
方法:從行開始,遇到標籤以前,存在字符,content 的值爲這些字符串。 從一個標籤,遇到下一個標籤以前, 存在字符,content 的值爲這些字符串。 從一個標籤,遇到行結束符以前,存在字符,content 的值爲這些字符串。 標籤能夠是開始標籤,也能夠是結束標籤。
startDocument()
方法:文檔啓動的時候調用。endDocument()
方法:解析器到達文檔結尾時調用。startElement(name, attrs)
方法:遇到XML開始標籤時調用,name 是標籤的名字,attrs 是標籤的屬性值字典。endElement(name)
方法:遇到XML結束標籤時調用。make_parser()方法用於建立一個新的解析器對象並返回。建立的解析器對象將是系統找到的第一個解析器類型。orm
語法以下:xml
xml.sax.make_parser(parser_list) parser_list -- 可選參數,解析器列表
parser ()方法用於建立一個 SAX 解析器並解析xml文檔。對象
語法以下:
xml.sax.parse( xmlfile, contenthandler[, errorhandler]) xmlfile -- xml文件名 contenthandler -- 必須是一個ContentHandler對象 errorhandler -- 若是指定該參數,errorhandler必須是一個SAX ErrorHandler對象
parseString()方法建立一個 XML 解析器並解析 xml 字符串。
語法以下:
xml.sax.parseString(xmlstring, contenthandler[, errorhandler]) xmlstring -- xml字符串 contenthandler -- 必須是一個ContentHandler的對象 errorhandler -- 若是指定該參數,errorhandler必須是一個SAX ErrorHandler對象
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 = "" # 元素開始調用 def startElement(self, tag, attributes): self.CurrentData = tag if tag == "movie": print("-----電影信息介紹-----") title = attributes["title"] print("Title:", title) # 元素結束調用 def endElement(self, tag): if self.CurrentData == "type": print("類型:", self.type) elif self.CurrentData == "format": print("格式:", self.format) elif self.CurrentData == "year": print("時間:", self.year) elif self.CurrentData == "rating": print("評級:", self.rating) elif self.CurrentData == "stars": print("星星:", self.stars) elif self.CurrentData == "description": print("描述:", self.description, "\n") self.CurrentData = "" # 讀取字符時調用 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__"): # 建立一個 XMLReader parser = xml.sax.make_parser() # 關閉命名空間 parser.setFeature(xml.sax.handler.feature_namespaces, 0) # 重寫 ContextHandler Handler = MovieHandler() parser.setContentHandler(Handler) parser.parse("movies.xml")
運行程序後輸出結果以下:
-----電影信息介紹----- Title: 重返二十歲 類型: 喜劇,親情,愛情,奇幻 格式: DVD 時間: 2014 評級: 7歲以上能夠觀看 星星: 8 描述: 影片講述了一位七旬老太太難以想象變身爲妙齡女子後,以新身份回到平常生活,引起的一系列哭笑不得的奇幻故事 -----電影信息介紹----- Title: 流浪地球 類型: 科幻、災難、冒險、動做 格式: DVD 時間: 2019 評級: R 星星: 10 描述: 講述了太陽即將毀滅,已經不適合人類生存,而面對絕境,人類將開啓「流浪地球」計劃 -----電影信息介紹----- Title: 惡棍天使 類型: 喜劇,愛情 格式: DVD 時間: 2015 評級: PG 星星: 10 描述: 講述了高智商低情商女學霸查小刀遇到專職替人討債的惡棍莫非裏,倆人在神醫折耳根的介紹下互相「治療」發生的一系列故事 -----電影信息介紹----- Title: 戰狼 類型: 動做,戰爭,軍事 格式: VHS 時間: 2015 評級: PG 星星: 10 描述: 講述的是小人物成長爲拯救國家和民族命運的孤膽英雄的傳奇故事
文檔對象模型是來自W3C的跨語言API,用於訪問和修改XML文檔。
DOM解析器在解析一個XML文檔時,一次性讀取整個文檔,把文檔中全部元素保存在內存中的一個樹結構裏。以後能夠利用DOM 提供的不一樣的函數來讀取或修改文檔的內容和結構,也能夠把修改過的內容寫入xml文件。
使用xml.dom.minidom來解析xml文件時,minidom對象提供了一種簡單的解析器方法,能夠從XML文件中快速建立DOM樹。
from xml.dom.minidom import parse import xml.dom.minidom # 使用minidom解析器打開XML文檔 DOMTree = xml.dom.minidom.parse("movies.xml") collection = DOMTree.documentElement if collection.hasAttribute("shelf"): print ("根元素 : %s" % collection.getAttribute("shelf")) # 在集合中獲取全部電影 movies = collection.getElementsByTagName("movie") # 打印每部電影的詳細信息 for movie in movies: print ("-----電影信息介紹-----") if movie.hasAttribute("title"): print ("標題: %s" % movie.getAttribute("title")) type = movie.getElementsByTagName('type')[0] print ("類型: %s" % type.childNodes[0].data) format = movie.getElementsByTagName('format')[0] print ("格式: %s" % format.childNodes[0].data) rating = movie.getElementsByTagName('rating')[0] print ("等級: %s" % rating.childNodes[0].data) stars = movie.getElementsByTagName('stars')[0] print("星星: %s" % stars.childNodes[0].data) description = movie.getElementsByTagName('description')[0] print ("描述: %s" % description.childNodes[0].data, "\n")
運行程序後輸出結果以下:
根元素 : 新品推薦 -----電影信息介紹----- 標題: 重返二十歲 類型: 喜劇,親情,愛情,奇幻 格式: DVD 等級: PG 星星: 8 描述: 影片講述了一位七旬老太太難以想象變身爲妙齡女子後,以新身份回到平常生活,引起的一系列哭笑不得的奇幻故事 -----電影信息介紹----- 標題: 流浪地球 類型: 科幻、災難、冒險、動做 格式: DVD 等級: R 星星: 10 描述: 講述了太陽即將毀滅,已經不適合人類生存,而面對絕境,人類將開啓「流浪地球」計劃 -----電影信息介紹----- 標題: 惡棍天使 類型: 喜劇,愛情 格式: DVD 等級: PG 星星: 10 描述: 講述了高智商低情商女學霸查小刀遇到專職替人討債的惡棍莫非裏,倆人在神醫折耳根的介紹下互相「治療」發生的一系列故事 -----電影信息介紹----- 標題: 戰狼 類型: 動做,戰爭,軍事 格式: VHS 等級: PG 星星: 10 描述: 講述的是小人物成長爲拯救國家和民族命運的孤膽英雄的傳奇故事