日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

python 使用sax 解析xml 文件

發(fā)布時間:2023/11/27 生活经验 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 使用sax 解析xml 文件 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

這里不是說xml 的所以如果xml 不了解,可以百度大致看下即可,

SAX知識了解

SAX (simple API for XML )? 有解析器和事件處理器

解析器負(fù)責(zé)讀取XML文檔,并向事件處理器發(fā)送事件,如元素開始跟元素結(jié)束事件。

而事件處理器則負(fù)責(zé)對事件作出響應(yīng),對傳遞的XML數(shù)據(jù)進(jìn)行處理。

sax的主要方法

1 startDocument() : 文檔啟動的時候調(diào)用。

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

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

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

5?characters :內(nèi)容處理

6?make_parser : 創(chuàng)建一個解釋器對象并返回

7?parser : 解析xml

demo 練習(xí) python的 sax 解析xml

demo1 讀取只有標(biāo)簽的xml

創(chuàng)建一個config.xml 的文件內(nèi)容如下:

<?xml version="1.0" encoding="UTF-8"?>
<config_content><lib name="a" path="a的路徑"/><lib name="b" path="b的路徑"/><lib name="c" path="c的路徑"/>
</config_content>

代碼如下

import xml.saxclass ConfigHandler(xml.sax.ContentHandler):def __init__(self):self.tag = ""self.name = ""self.path = ""# 啟動文檔def startDocument(self):print("******解析配置文件開始******")# 開始解析xmldef startElement(self, name, attributes):self.tag = nameif name == "lib":self.name = attributes["name"]self.path = attributes["path"]print(self.name)print(self.path)# xml內(nèi)容事件處理def characters(self, content):pass# 結(jié)束解析xmldef endElement(self, name):pass# xml結(jié)束標(biāo)簽調(diào)用def endDocument(self):print("******配置文件解析結(jié)束******")if __name__ == "__main__":# 創(chuàng)建一個 XMLReaderparser = xml.sax.make_parser()# turn off namepsacesparser.setFeature(xml.sax.handler.feature_namespaces, 0)# 重寫 ContextHandlerHandler = ConfigHandler()parser.setContentHandler(Handler)# 解析 xml 這里可以寫xml 的具體路徑,為了簡單放在了同一個文件夾里面了parser.parse("config.xml")

打印結(jié)果如下

由于讀取的xml 只有標(biāo)簽這里內(nèi)容處理和結(jié)束的時候并沒有做其他的操作,可以出sax 讀取xml 的時候是一行一行讀取的,這里只有單行所以沒有重復(fù)的問題,如果我們要使用讀取的數(shù)據(jù),可以把數(shù)據(jù)存放到 list 中或者存放到字典中,如下

class ConfigHandler(xml.sax.ContentHandler):config_map = {}config_name_list = []config_path_list = []def __init__(self):self.tag = ""self.name = ""self.path = ""# 啟動文檔def startDocument(self):print("******解析配置文件開始******")# 開始解析xmldef startElement(self, name, attributes):self.tag = nameif name == "lib":self.name = attributes["name"]self.path = attributes["path"]# print(self.name)# print(self.path)self.config_name_list.append(self.name)print(self.config_name_list)self.config_path_list.append(self.path)print(self.config_path_list)self.config_map.update({self.name: self.path})print(self.config_map)# xml內(nèi)容事件處理def characters(self, content):pass# 結(jié)束解析xmldef endElement(self, name):pass# xml結(jié)束標(biāo)簽調(diào)用def endDocument(self):print("******配置文件解析結(jié)束******")if __name__ == "__main__":# 創(chuàng)建一個 XMLReaderparser = xml.sax.make_parser()# turn off namepsacesparser.setFeature(xml.sax.handler.feature_namespaces, 0)# 重寫 ContextHandlerHandler = ConfigHandler()parser.setContentHandler(Handler)# 解析 xml 這里可以寫xml 的具體路徑,為了簡單放在了同一個文件夾里面了parser.parse("config.xml")

打印結(jié)果

demo2?讀取同標(biāo)簽不同內(nèi)容的xml

xml內(nèi)容如下

<?xml version="1.0" encoding="UTF-8"?>
<config_content><type class="3年級"><lib name="體育">優(yōu)秀</lib><lib name="語文">一般</lib><lib name="數(shù)學(xué)">優(yōu)秀</lib></type><type class="5年級"><lib name="體育">一般</lib><lib name="語文">優(yōu)秀</lib><lib name="數(shù)學(xué)">良好</lib></type>
</config_content>

python 代碼如下

import xml.saxclass ConfigHandler(xml.sax.ContentHandler):def __init__(self):self.tag = ""self.name = ""self.label = ""self.content = ""# 啟動文檔def startDocument(self):print("******解析配置文件開始******")# 開始解析xmldef startElement(self, name, attributes):self.tag = nameif name == "type":self.name = attributes["class"]print(self.name)if name == "lib":self.label = attributes["name"]print(self.label)# xml內(nèi)容事件處理def characters(self, content):self.content = content# 結(jié)束解析xmldef endElement(self, name):if name == "lib":print(self.content)# xml結(jié)束標(biāo)簽調(diào)用def endDocument(self):print("******配置文件解析結(jié)束******")if __name__ == "__main__":# 創(chuàng)建一個 XMLReaderparser = xml.sax.make_parser()# turn off namepsacesparser.setFeature(xml.sax.handler.feature_namespaces, 0)# 重寫 ContextHandlerHandler = ConfigHandler()parser.setContentHandler(Handler)# 解析 xml 這里可以寫xml 的具體路徑,為了簡單放在了同一個文件夾里面了parser.parse("config.xml")

打印結(jié)果如下


demo3?讀取相同標(biāo)簽多個標(biāo)題的xml

xml 內(nèi)容如下

<?xml version="1.0" encoding="UTF-8"?>
<config_content><school name="第六中學(xué)"><type class="2年級"><Language>優(yōu)秀</Language><Math>一般</Math><English>優(yōu)秀</English></type><type class="5年級"><Language>優(yōu)秀</Language><Math>一般</Math><English>優(yōu)秀</English></type></school><school name="第九中學(xué)"><type class="1年級"><Language>優(yōu)秀</Language><Math>一般</Math><English>優(yōu)秀</English></type><type class="3年級"><Language>優(yōu)秀</Language><Math>一般</Math><English>優(yōu)秀</English></type></school>
</config_content>

python 代碼如下

import xml.saxclass ConfigHandler(xml.sax.ContentHandler):def __init__(self):self.tag = ""self.name = ""self.label = ""self.content = ""# 啟動文檔def startDocument(self):print("******解析配置文件開始******")# 開始解析xmldef startElement(self, name, attributes):self.tag = nameif name == "school":self.name = attributes["name"]print(self.name)if name == "type":self.label = attributes["class"]print(self.label)# xml內(nèi)容事件處理def characters(self, content):self.content = content# 結(jié)束解析xmldef endElement(self, name):if name == "Language":print(self.content)elif name == "Math":print(self.content)elif name == "English":print(self.content)# xml結(jié)束標(biāo)簽調(diào)用def endDocument(self):print("******配置文件解析結(jié)束******")if __name__ == "__main__":# 創(chuàng)建一個 XMLReaderparser = xml.sax.make_parser()# turn off namepsacesparser.setFeature(xml.sax.handler.feature_namespaces, 0)# 重寫 ContextHandlerHandler = ConfigHandler()parser.setContentHandler(Handler)# 解析 xml 這里可以寫xml 的具體路徑,為了簡單放在了同一個文件夾里面了parser.parse("config.xml")

打印結(jié)果如下:

******解析配置文件開始******
第六中學(xué)
2年級
優(yōu)秀
一般
優(yōu)秀
5年級
優(yōu)秀
一般
優(yōu)秀
第九中學(xué)
1年級
優(yōu)秀
一般
優(yōu)秀
3年級
優(yōu)秀
一般
優(yōu)秀
******配置文件解析結(jié)束******

最后總結(jié),python 使用sax 讀取xml 不難,可能存在組合數(shù)據(jù)的時候出現(xiàn)數(shù)據(jù)重現(xiàn)的問題,這個可以在拼接完數(shù)據(jù)之后,清空一下數(shù)據(jù)源,試試看,由于需求不一樣,這里就不在寫各種需求的組合數(shù)據(jù)了,大家注意一下數(shù)據(jù)重復(fù)問題即可。

?

?

?

總結(jié)

以上是生活随笔為你收集整理的python 使用sax 解析xml 文件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。