什么是XML?
XML 指可擴(kuò)展標(biāo)記語言(eXtensible Markup Language)。
XML 被設(shè)計用來傳輸和存儲數(shù)據(jù)。
XML是一套定義語義標(biāo)記的規(guī)則,這些標(biāo)記將文檔分成許多部件并對這些部件加以標(biāo)識。
它也是元標(biāo)記語言,即定義了用于定義其他與特定領(lǐng)域有關(guān)的、語義的、結(jié)構(gòu)化的標(biāo)記語言的句法語言。
python對XML的解析
常見的XML編程接口有DOM和SAX,這兩種接口處理XML文件的方式不同,當(dāng)然使用場合也不同。
python有三種方法解析XML,SAX,DOM,以及ElementTree:
1.SAX (simple API for XML )
python 標(biāo)準(zhǔn)庫包含SAX解析器,SAX用事件驅(qū)動模型,通過在解析XML的過程中觸發(fā)一個個的事件并調(diào)用用戶定義的回調(diào)函數(shù)來處理XML文件。
2.DOM(Document Object Model)
將XML數(shù)據(jù)在內(nèi)存中解析成一個樹,通過對樹的操作來操作XML。
3.ElementTree(元素樹)
ElementTree就像一個輕量級的DOM,具有方便友好的API。代碼可用性好,速度快,消耗內(nèi)存少。
注:因DOM需要將XML數(shù)據(jù)映射到內(nèi)存中的樹,一是比較慢,二是比較耗內(nèi)存,而SAX流式讀取XML文件,比較快,占用內(nèi)存少,但需要用戶實(shí)現(xiàn)回調(diào)函數(shù)(handler)。
本章節(jié)使用到的XML實(shí)例文件movies.xml內(nèi)容如下:
<collection shelf="New Arrivals"><movie title="Enemy Behind"> <type>War, Thriller</type> <format>DVD</format> <year>2003</year> <rating>PG</rating> <stars>10</stars> <description>Talk about a US-Japan war</description></movie><movie title="Transformers"> <type>Anime, Science Fiction</type> <format>DVD</format> <year>1989</year> <rating>R</rating> <stars>8</stars> <description>A schientific fiction</description></movie> <movie title="Trigun"> <type>Anime, Action</type> <format>DVD</format> <episodes>4</episodes> <rating>PG</rating> <stars>10</stars> <description>Vash the Stampede!</description></movie><movie title="Ishtar"> <type>Comedy</type> <format>VHS</format> <rating>PG</rating> <stars>2</stars> <description>Viewable boredom</description></movie></collection>
python使用SAX解析xml
SAX是一種基于事件驅(qū)動的API。
利用SAX解析XML文檔牽涉到兩個部分:解析器和事件處理器。
解析器負(fù)責(zé)讀取XML文檔,并向事件處理器發(fā)送事件,如元素開始跟元素結(jié)束事件;
而事件處理器則負(fù)責(zé)對事件作出相應(yīng),對傳遞的XML數(shù)據(jù)進(jìn)行處理。
1、對大型文件進(jìn)行處理;
2、只需要文件的部分內(nèi)容,或者只需從文件中得到特定信息。
3、想建立自己的對象模型的時候。
在python中使用sax方式處理xml要先引入xml.sax中的parse函數(shù),還有xml.sax.handler中的ContentHandler。
ContentHandler類方法介紹
characters(content)方法
調(diào)用時機(jī):
從行開始,遇到標(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方法
以下方法創(chuàng)建一個新的解析器對象并返回。
xml.sax.make_parser( [parser_list] )
參數(shù)說明:
parser_list - 可選參數(shù),解析器列表
parser方法
以下方法創(chuàng)建一個 SAX 解析器并解析xml文檔:
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
參數(shù)說明:
xmlfile - xml文件名
contenthandler - 必須是一個ContentHandler的對象
errorhandler - 如果指定該參數(shù),errorhandler必須是一個SAX ErrorHandler對象
parseString方法
parseString方法創(chuàng)建一個XML解析器并解析xml字符串:
xml.sax.parseString(xmlstring, contenthandler[, errorhandler])
參數(shù)說明:
xmlstring - xml字符串
contenthandler - 必須是一個ContentHandler的對象
errorhandler - 如果指定該參數(shù),errorhandler必須是一個SAX ErrorHandler對象
Python 解析XML實(shí)例
#!/usr/bin/python# -*- coding: UTF-8 -*-import xml.saxclass 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 "*****Movie*****" title = attributes["title"] print "Title:", title # 元素結(jié)束事件處理 def endElement(self, tag): if self.CurrentData == "type": print "Type:", self.type elif self.CurrentData == "format": print "Format:", self.format elif self.CurrentData == "year": print "Year:", self.year elif self.CurrentData == "rating": print "Rating:", self.rating elif self.CurrentData == "stars": print "Stars:", self.stars elif self.CurrentData == "description": print "Description:", self.description self.CurrentData = "" # 內(nèi)容事件處理 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() # turn off namepsaces parser.setFeature(xml.sax.handler.feature_namespaces, 0) # 重寫 ContextHandler Handler = MovieHandler() parser.setContentHandler( Handler ) parser.parse("movies.xml")
以上代碼執(zhí)行結(jié)果如下:
*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDYear: 2003Rating: PGStars: 10Description: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDYear: 1989Rating: RStars: 8Description: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGStars: 10Description: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGStars: 2Description: Viewable boredom
使用xml.dom解析xml
文件對象模型(Document Object Model,簡稱DOM),是W3C組織推薦的處理可擴(kuò)展置標(biāo)語言的標(biāo)準(zhǔn)編程接口。
一個 DOM 的解析器在解析一個 XML 文檔時,一次性讀取整個文檔,把文檔中所有元素保存在內(nèi)存中的一個樹結(jié)構(gòu)里,之后你可以利用DOM 提供的不同的函數(shù)來讀取或修改文檔的內(nèi)容和結(jié)構(gòu),也可以把修改過的內(nèi)容寫入xml文件。
python中用xml.dom.minidom來解析xml文件,實(shí)例如下:
#!/usr/bin/python# -*- coding: UTF-8 -*-from xml.dom.minidom import parseimport xml.dom.minidom# 使用minidom解析器打開 XML 文檔DOMTree = xml.dom.minidom.parse("movies.xml")collection = DOMTree.documentElementif collection.hasAttribute("shelf"): print "Root element : %s" % collection.getAttribute("shelf")# 在集合中獲取所有電影movies = collection.getElementsByTagName("movie")# 打印每部電影的詳細(xì)信息for movie in movies: print "*****Movie*****" if movie.hasAttribute("title"): print "Title: %s" % movie.getAttribute("title") type = movie.getElementsByTagName('type')[0] print "Type: %s" % type.childNodes[0].data format = movie.getElementsByTagName('format')[0] print "Format: %s" % format.childNodes[0].data rating = movie.getElementsByTagName('rating')[0] print "Rating: %s" % rating.childNodes[0].data description = movie.getElementsByTagName('description')[0] print "Description: %s" % description.childNodes[0].data
以上程序執(zhí)行結(jié)果如下:
Root element : New Arrivals*****Movie*****Title: Enemy BehindType: War, ThrillerFormat: DVDRating: PGDescription: Talk about a US-Japan war*****Movie*****Title: TransformersType: Anime, Science FictionFormat: DVDRating: RDescription: A schientific fiction*****Movie*****Title: TrigunType: Anime, ActionFormat: DVDRating: PGDescription: Vash the Stampede!*****Movie*****Title: IshtarType: ComedyFormat: VHSRating: PGDescription: Viewable boredom
Atas ialah kandungan terperinci Python之XML解析詳解. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undress AI Tool
Gambar buka pakaian secara percuma

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)