什麼是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內容如下:
ion>
🎠
從一個標籤,遇到行結束符之前,存在字符,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": description
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]
以上程式執行結果如下:
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: TrigunType: Anime, Action55:Type: Anime, Action
55: the;
*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Description:
Rating: PG
Description: