首頁  >  文章  >  後端開發  >  python XML解析

python XML解析

高洛峰
高洛峰原創
2016-11-23 13:58:061099瀏覽

什麼是XML?

XML 指可擴充標記語言(eXtensible Markup Language)。 你可以透過本站學習XML教學

XML 被設計用來傳輸和儲存資料。

XML是一套定義語意標記的規則,這些標記將文件分成許多部件並對這些部件加以標識。

它也是元標記語言,即定義了用於定義其他與特定領域有關的、語義的、結構化的標記語言的句法語言。

python對XML的解析

常見的XML程式介面有DOM和SAX,這兩種介面處理XML檔案的方式不同,當然使用場合也不同。

python有三種方法解析XML,SAX,DOM,以及ElementTree:

1.SAX (simple API for XML )

pyhton 標準庫包含SAX解析器,SAX用事件驅動模型,透過在解析XML的過程中觸發一個個的事件並呼叫使用者定義的回呼函數來處理XML檔案。

2.DOM(Document Object Model)

將XML資料在記憶體中解析成一個樹,透過對樹的操作來操作XML。

3.ElementTree(元素樹)

ElementTree就像一個輕量級的DOM,具有方便友好的API。程式碼可用性好,速度快,消耗記憶體少。

註:因DOM需要將XML資料映射到記憶體中的樹,一是比較慢,二是比較耗內存,而SAX流式讀取XML文件,比較快,佔用內存少,但需要用戶實現回調函數(handler)。

本章節所使用的XML實例檔案movies.xml內容如下:

   DVD

   2003

   PG🠎

   PG🠎

   PG🠎

   about a US-Japan war

   

   1989

   R

   8

ion>

   

   Anime, Action

   DVD

   45

🎠

   10

   Vash the Stampede!

VHS

   PG

   2

   Viewable boredom

   Viewable >

   

 

python使用SAX解析xml

SAX是一種基於事件驅動的API。

利用SAX解析XML文件牽涉到兩個部分:解析器和事件處理器。

解析器負責讀取XML文檔,並向事件處理器發送事件,如元素開始跟元素結束事件;

而事件處理器則負責對事件作出相應,對傳遞的XML資料進行處理。

1、對大型文件進行處理;

2、只需要文件的部分內容,或只需從文件中得到特定資訊。

3、想建立自己的物件模型的時候。

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

ContentHandler類別方法介紹

characters(content)方法

調用時機:

從行開始,遇到標籤之前,存在字符,content的值為這些字串。

從一個標籤,遇到下一個標籤之前, 存在字符,content的值為這些字串。

從一個標籤,遇到行結束符之前,存在字符,content的值為這些字串。

標籤可以是開始標籤,也可以是結束標籤。

startDocument()方法

文檔啟動的時候呼叫。

endDocument()方法

解析器到達文件結尾時呼叫。

startElement(name, attrs)方法

遇到XML開始標籤時調用,name是標籤的名字,attrs是標籤的屬性值字典。

endElement(name)方法

遇到XML結束標籤時呼叫。

make_parser方法

以下方法建立一個新的解析器物件並回傳。

xml.sax.make_parser( [parser_list] )

   

參數說明:list

list一個SAX 解析器並解析xml文件:

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

   

hand3pyk

一個ContentHandler的對象

errorhandler - 如果指定該參數,errorhandler必須是一個SAX ErrorHandler物件

parseString方法

parseString方法建立一個XML解析器並解析xml字串:

ax

[, errorhandler])

   

參數說明:

xmlstring - xml字串

contenthandler 鈴

Python解析XML實例

#!/usr/bin/python

 

import xml.sax

 __init__(self):

      self .CurrentData = ""

      self.type = ""

      self.format    self.rating = ""

      self.stars = ""

      self.description = ""

 

   # 元素開始事件處理

   def startElement(self, tag, attributes): if tag == "movie":

         print "***** Movie*****"

         title = attributes["title"]

         

   def endElement(self, tag):

      if self. CurrentData == "type":

         print "類型:", self.type

      "Format:", self.format

      elif self.CurrentData == " year":

         print "Year:", self.year

      elif , self.rating

      elif self.CurrentData == "stars":

         print "Stars:", self.stars

      elif self.CurrentData == "description":  elif self.CurrentData == "description":  elif self.CurrentData == "description":  elif self.CurrentData == "description":  elif self.CurrentData == "description":  elif self.CurrentData == "description": de​​scription

      self.CurrentData = ""

 

   # 內容事件處理

   def characters(self, content):

      if self.CurrentData == "type":

if self.CurrentData == "format":

? self. rating = 內容

      elif self.CurrentData== 「星星」:

        == 「說明」:

         self.description = 內容

  

if ( __name__ == 「__main__」 ):

   

# 一個 XMLReader

   parser = xml. xml.sax.handler.feature_namespaces, 0)

   # 重寫ContextHandler

   Handler = MovieHandler ()

parser.setContenthandler(處理程序)

.S.

以上程式碼執行結果:

**** ***

標題:敵人背後

類型:戰爭、驚悚

格式:DVD

年份:2003

評級:PG

* ****電影*****

標題:變形金剛

類型:動畫、科幻小說

格式:DVD

年份:1989

:一部科普小說

*****電影*****

標題:Trigun

類型:動畫、動作

格式:DVD

評級:PG

星星:10

描述:V the Stampede!

*****電影*****

標題:伊什塔爾

類型:喜劇

格式:VHS

評級:PG

星星:2

描述:可見的無聊

完整的SAX API文件請查閱Python SAX APIs

使用xml.dom解析xml

文件物件模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可置標語言的標準程式設計接口。

一個DOM的解析器在解析一個XML 文檔時,一次性讀取整個文檔,把文檔中所有元素保存在內存中的一個樹結構裡修改,之後你可以利用DOM 提供的不同的函數來讀取或文件的內容和結構,也可以把過的內容寫入xml檔。

python中用xml.dom.minidom來修改xml文件,實例如下:

#!/usr/bin/python

 

7% .minidom

 

# 使用minidom解析器開啟XML 文件

DOMTree = xml.dom.minidom.parse("movies.xml")

集合=Copf.ree.documentElement). :

   print "根元素 : %s" % collection.getAttribute("shelf")

 

# # 列印每部電影的細節

對於電影中的電影:

   印刷「*****電影*****」

   if movie.hasAttribute( "title % movie.getAttribute("title")

 

   type = movie.getElementsByTagName('type')[0]

 )類型=print movie. getElementsByTagName('format')[0]

   print "格式: %s" % format.childNodes[0].data

   ” %  rating.childNodes[0].data

   描述= movie.getElementsByTagName('description')[0]

   print 

以上程式執行結果如下:

Root element : New Arrivals

*****Movie*****

Title: Enemy Behindvie*****

Title: Enemy Behind骨Rating : PG

Description: Talk about a US-Japan war

*****Movie*****

Title: Transformers

Type:

Description: A schientific fiction

*****Movie*****

Title: Trigun

Type: Anime, Action

55: 

Type: Anime, Action

55: the;

*****Movie*****

Title: Ishtar

Type: Comedy

Format: VHS

Rating: PG

Description:

Rating: PG

Description:

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
上一篇:Python JSON下一篇:Python JSON