python之XML解析

XML 指可擴展標記語言,標準通用標記語言的子集,是一種用於標記電子文件使其具備結構性的標記語言。python

XML 被設計用來傳輸和存儲數據。XML適用於跟蹤中小型數據而無需基於SQL的主幹。編程

Python 對 XML 的解析

常見的 XML 編程接口有 DOM 和 SAX,這兩種接口處理 XML 文件的方式不一樣,使用場景也不一樣。dom

Python有三種方法解析XML,分別是SAX、DOM和ElementTree:函數

  • SAX:Python 標準庫包含 SAX 解析器,SAX 用事件驅動模型,經過在解析 XML 的過程當中觸發一個個的事件並調用用戶定義的回調函數來處理 XML 文件。
  • DOM:將 XML 數據在內存中解析成一個樹,經過對樹的操做來操做 XML。
  • ElementTree:ElementTree(元素樹)就像一個輕量級的DOM,具備方便友好的API。代碼可用性好,速度快,消耗內存少。

因DOM須要將XML數據映射到內存中的樹,會比較慢和消耗內存,而SAX流式讀取XML文件,比較快,佔用內存少,但須要用戶實現回調函數(handler)。spa

本章節使用到的 XML 實例文件movies.xml內容以下:設計

<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解析XML

SAX 是一種基於事件驅動的API。利用 SAX 解析 XML 文檔牽涉到兩個部分,解析器事件處理器。解析器負責讀取 XML 文檔,並向事件處理器發送事件,如元素開始跟元素結束事件。而事件處理器則負責對事件做出響應,對傳遞的 XML 數據進行處理。code

在 Python 中使用 sax 方式處理 xml 要先引入 xml.sax 中的 parse 函數,還有 xml.sax.handler 中的 ContentHandler。orm

ContentHandler 類方法介紹

  • characters(content)方法:
從行開始,遇到標籤以前,存在字符,content 的值爲這些字符串。
從一個標籤,遇到下一個標籤以前, 存在字符,content 的值爲這些字符串。
從一個標籤,遇到行結束符以前,存在字符,content 的值爲這些字符串。
標籤能夠是開始標籤,也能夠是結束標籤。
  • startDocument()方法:文檔啓動的時候調用。
  • endDocument()方法:解析器到達文檔結尾時調用。
  • startElement(name, attrs) 方法:遇到XML開始標籤時調用,name 是標籤的名字,attrs 是標籤的屬性值字典。
  • endElement(name) 方法:遇到XML結束標籤時調用。

make_parser方法

make_parser()方法用於建立一個新的解析器對象並返回。建立的解析器對象將是系統找到的第一個解析器類型。xml

語法以下:對象

xml.sax.make_parser(parser_list)

parser_list  -- 可選參數,解析器列表

parser方法

parser ()方法用於建立一個 SAX 解析器並解析xml文檔。

語法以下:

xml.sax.parse( xmlfile, contenthandler[, errorhandler])

xmlfile -- xml文件名
contenthandler -- 必須是一個ContentHandler對象
errorhandler -- 若是指定該參數,errorhandler必須是一個SAX ErrorHandler對象

parseString方法

parseString()方法建立一個 XML 解析器並解析 xml 字符串。

語法以下:

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])

xmlstring -- xml字符串
contenthandler -- 必須是一個ContentHandler的對象
errorhandler -- 若是指定該參數,errorhandler必須是一個SAX ErrorHandler對象

Python 解析XML實例

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
描述: 講述的是小人物成長爲拯救國家和民族命運的孤膽英雄的傳奇故事

使用DOM API解析XML

文檔對象模型是來自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
描述: 講述的是小人物成長爲拯救國家和民族命運的孤膽英雄的傳奇故事

參考:https://www.9xkd.com/

相關文章
相關標籤/搜索