python 使用sax 解析xml 文件
這里不是說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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 水浒传片尾的图画是谁画的啊?
- 下一篇: python 使用import导入不同文