Python解析XML實例分享

本篇內(nèi)容主要講解“Python解析XML實例分享”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Python解析XML實例分享”吧!

站在用戶的角度思考問題,與客戶深入溝通,找到姚安網(wǎng)站設(shè)計與姚安網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗,讓設(shè)計與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個性化、用戶體驗好的作品,建站類型包括:成都做網(wǎng)站、網(wǎng)站設(shè)計、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國際域名空間、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋姚安地區(qū)。

Python 對 XML 的解析

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

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

  • SAX:Python 標(biāo)準(zhǔn)庫包含 SAX 解析器,SAX 用事件驅(qū)動模型,通過在解析 XML 的過程中觸發(fā)一個個的事件并調(diào)用用戶定義的回調(diào)函數(shù)來處理 XML 文件。

  • DOM:將 XML 數(shù)據(jù)在內(nèi)存中解析成一個樹,通過對樹的操作來操作 XML。

  • ElementTree:ElementTree(元素樹)就像一個輕量級的DOM,具有方便友好的API。代碼可用性好,速度快,消耗內(nèi)存少。

因DOM需要將XML數(shù)據(jù)映射到內(nèi)存中的樹,會比較慢和消耗內(nèi)存,而SAX流式讀取XML文件,比較快,占用內(nèi)存少,但需要用戶實現(xiàn)回調(diào)函數(shù)(handler)。

本章節(jié)使用到的 XML 實例文件movies.xml內(nèi)容如下:

<collection shelf="新品推薦">
<movie title="重返二十歲">
   <type>喜劇,親情,愛情,奇幻</type>
   <format>DVD</format>
   <year>2014</year>
   <rating>PG</rating>
   <stars>8</stars>
   <description>影片講述了一位七旬老太太不可思議變身為妙齡女子后,以新身份回到日常生活,引發(fā)的一系列啼笑皆非的奇幻故事</description>
</movie>
<movie title="流浪地球">
   <type>科幻、災(zāi)難、冒險、動作</type>
   <format>DVD</format>
   <year>2019</year>
   <rating>R</rating>
   <stars>10</stars>
   <description>講述了太陽即將毀滅,已經(jīng)不適合人類生存,而面對絕境,人類將開啟“流浪地球”計劃    </description>
</movie>
   <movie title="惡棍天使">
   <type>喜劇,愛情</type>
   <format>DVD</format>
   <year>2015</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>講述了高智商低情商女學(xué)霸查小刀遇到專職替人討債的惡棍莫非里,倆人在神醫(yī)折耳根的介紹下互相“治療”發(fā)生的一系列故事</description>
</movie>
<movie title="戰(zhàn)狼">
   <type>動作,戰(zhàn)爭,軍事</type>
   <format>VHS</format>
   <year>2015</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>講述的是小人物成長為拯救國家和民族命運的孤膽英雄的傳奇故事</description>
</movie>
</collection>
使用SAX API解析XML

SAX 是一種基于事件驅(qū)動的API。利用 SAX 解析 XML 文檔牽涉到兩個部分,解析器事件處理器。解析器負(fù)責(zé)讀取 XML 文檔,并向事件處理器發(fā)送事件,如元素開始跟元素結(jié)束事件。而事件處理器則負(fù)責(zé)對事件作出響應(yīng),對傳遞的 XML 數(shù)據(jù)進(jìn)行處理。

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

ContentHandler 類方法介紹
  • characters(content)方法:

從行開始,遇到標(biāo)簽之前,存在字符,content 的值為這些字符串。
從一個標(biāo)簽,遇到下一個標(biāo)簽之前, 存在字符,content 的值為這些字符串。
從一個標(biāo)簽,遇到行結(jié)束符之前,存在字符,content 的值為這些字符串。
標(biāo)簽可以是開始標(biāo)簽,也可以是結(jié)束標(biāo)簽。
  • startDocument()方法:文檔啟動的時候調(diào)用。

  • endDocument()方法:解析器到達(dá)文檔結(jié)尾時調(diào)用。

  • startElement(name, attrs) 方法:遇到XML開始標(biāo)簽時調(diào)用,name 是標(biāo)簽的名字,attrs 是標(biāo)簽的屬性值字典。

  • endElement(name) 方法:遇到XML結(jié)束標(biāo)簽時調(diào)用。

make_parser方法

make_parser()方法用于創(chuàng)建一個新的解析器對象并返回。創(chuàng)建的解析器對象將是系統(tǒng)找到的第一個解析器類型。

語法如下:

xml.sax.make_parser(parser_list)
parser_list  -- 可選參數(shù),解析器列表
parser方法

parser ()方法用于創(chuàng)建一個 SAX 解析器并解析xml文檔。

語法如下:

xml.sax.parse( xmlfile, contenthandler[, errorhandler])
xmlfile -- xml文件名
contenthandler -- 必須是一個ContentHandler對象
errorhandler -- 如果指定該參數(shù),errorhandler必須是一個SAX ErrorHandler對象
parseString方法

parseString()方法創(chuàng)建一個 XML 解析器并解析 xml 字符串。

語法如下:

xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
xmlstring -- xml字符串
contenthandler -- 必須是一個ContentHandler的對象
errorhandler -- 如果指定該參數(shù),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 = ""
    # 元素開始調(diào)用
    def startElement(self, tag, attributes):
        self.CurrentData = tag
        if tag == "movie":
            print("-----電影信息介紹-----")
            title = attributes["title"]
            print("Title:", title)
    # 元素結(jié)束調(diào)用
    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 = ""
    # 讀取字符時調(diào)用
    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__"):
    # 創(chuàng)建一個 XMLReader
    parser = xml.sax.make_parser()
    # 關(guān)閉命名空間
    parser.setFeature(xml.sax.handler.feature_namespaces, 0)
    # 重寫 ContextHandler
    Handler = MovieHandler()
    parser.setContentHandler(Handler)
    parser.parse("movies.xml")

運行程序后輸出結(jié)果如下:

-----電影信息介紹-----
Title: 重返二十歲
類型: 喜劇,親情,愛情,奇幻
格式: DVD
時間: 2014
評級: 7歲以上可以觀看
星星: 8
描述: 影片講述了一位七旬老太太不可思議變身為妙齡女子后,以新身份回到日常生活,引發(fā)的一系列啼笑皆非的奇幻故事 
-----電影信息介紹-----
Title: 流浪地球
類型: 科幻、災(zāi)難、冒險、動作
格式: DVD
時間: 2019
評級: R
星星: 10
描述: 講述了太陽即將毀滅,已經(jīng)不適合人類生存,而面對絕境,人類將開啟“流浪地球”計劃     
-----電影信息介紹-----
Title: 惡棍天使
類型: 喜劇,愛情
格式: DVD
時間: 2015
評級: PG
星星: 10
描述: 講述了高智商低情商女學(xué)霸查小刀遇到專職替人討債的惡棍莫非里,倆人在神醫(yī)折耳根的介紹下互相“治療”發(fā)生的一系列故事 
-----電影信息介紹-----
Title: 戰(zhàn)狼
類型: 動作,戰(zhàn)爭,軍事
格式: VHS
時間: 2015
評級: PG
星星: 10
描述: 講述的是小人物成長為拯救國家和民族命運的孤膽英雄的傳奇故事
使用DOM API解析XML

文檔對象模型是來自W3C的跨語言API,用于訪問和修改XML文檔。

DOM解析器在解析一個XML文檔時,一次性讀取整個文檔,把文檔中所有元素保存在內(nèi)存中的一個樹結(jié)構(gòu)里。之后可以利用DOM 提供的不同的函數(shù)來讀取或修改文檔的內(nèi)容和結(jié)構(gòu),也可以把修改過的內(nèi)容寫入xml文件。

使用xml.dom.minidom來解析xml文件時,minidom對象提供了一種簡單的解析器方法,可以從XML文件中快速創(chuàng)建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")
# 打印每部電影的詳細(xì)信息
for movie in movies:
   print ("-----電影信息介紹-----")
   if movie.hasAttribute("title"):
      print ("標(biāo)題: %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")

運行程序后輸出結(jié)果如下:

根元素 : 新品推薦
-----電影信息介紹-----
標(biāo)題: 重返二十歲
類型: 喜劇,親情,愛情,奇幻
格式: DVD
等級: PG
星星: 8
描述: 影片講述了一位七旬老太太不可思議變身為妙齡女子后,以新身份回到日常生活,引發(fā)的一系列啼笑皆非的奇幻故事 
-----電影信息介紹-----
標(biāo)題: 流浪地球
類型: 科幻、災(zāi)難、冒險、動作
格式: DVD
等級: R
星星: 10
描述: 講述了太陽即將毀滅,已經(jīng)不適合人類生存,而面對絕境,人類將開啟“流浪地球”計劃     
-----電影信息介紹-----
標(biāo)題: 惡棍天使
類型: 喜劇,愛情
格式: DVD
等級: PG
星星: 10
描述: 講述了高智商低情商女學(xué)霸查小刀遇到專職替人討債的惡棍莫非里,倆人在神醫(yī)折耳根的介紹下互相“治療”發(fā)生的一系列故事 
-----電影信息介紹-----
標(biāo)題: 戰(zhàn)狼
類型: 動作,戰(zhàn)爭,軍事
格式: VHS
等級: PG
星星: 10
描述: 講述的是小人物成長為拯救國家和民族命運的孤膽英雄的傳奇故事

到此,相信大家對“Python解析XML實例分享”有了更深的了解,不妨來實際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

文章題目:Python解析XML實例分享
網(wǎng)站路徑:http://muchs.cn/article18/pidigp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、外貿(mào)建站、網(wǎng)頁設(shè)計公司、品牌網(wǎng)站制作、定制開發(fā)、面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁設(shè)計