python 使用sax 解析xml 文件
这里不是说xml 的所以如果xml 不了解,可以百度大致看下即可,
SAX知识了解
SAX (simple API for XML ) 有解析器和事件处理器
解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件。
而事件处理器则负责对事件作出响应,对传递的XML数据进行处理。
sax的主要方法
1 startDocument() : 文档启动的时候调用。
2 endDocument() : 解析器到达文档结尾时调用。
3 startElement(name, attrs): 遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。
4 endElement(name) : 遇到XML结束标签时调用。
5 characters :内容处理
6 make_parser : 创建一个解释器对象并返回
7 parser : 解析xml
demo 练习 python的 sax 解析xml
demo1 读取只有标签的xml
创建一个config.xml 的文件内容如下:
<?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内容事件处理def characters(self, content):pass# 结束解析xmldef endElement(self, name):pass# xml结束标签调用def endDocument(self):print("******配置文件解析结束******")if __name__ == "__main__":# 创建一个 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")
打印结果如下
由于读取的xml 只有标签这里内容处理和结束的时候并没有做其他的操作,可以出sax 读取xml 的时候是一行一行读取的,这里只有单行所以没有重复的问题,如果我们要使用读取的数据,可以把数据存放到 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内容事件处理def characters(self, content):pass# 结束解析xmldef endElement(self, name):pass# xml结束标签调用def endDocument(self):print("******配置文件解析结束******")if __name__ == "__main__":# 创建一个 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")
打印结果
demo2 读取同标签不同内容的xml
xml内容如下
<?xml version="1.0" encoding="UTF-8"?>
<config_content><type class="3年级"><lib name="体育">优秀</lib><lib name="语文">一般</lib><lib name="数学">优秀</lib></type><type class="5年级"><lib name="体育">一般</lib><lib name="语文">优秀</lib><lib name="数学">良好</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内容事件处理def characters(self, content):self.content = content# 结束解析xmldef endElement(self, name):if name == "lib":print(self.content)# xml结束标签调用def endDocument(self):print("******配置文件解析结束******")if __name__ == "__main__":# 创建一个 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")
打印结果如下
demo3 读取相同标签多个标题的xml
xml 内容如下
<?xml version="1.0" encoding="UTF-8"?>
<config_content><school name="第六中学"><type class="2年级"><Language>优秀</Language><Math>一般</Math><English>优秀</English></type><type class="5年级"><Language>优秀</Language><Math>一般</Math><English>优秀</English></type></school><school name="第九中学"><type class="1年级"><Language>优秀</Language><Math>一般</Math><English>优秀</English></type><type class="3年级"><Language>优秀</Language><Math>一般</Math><English>优秀</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内容事件处理def characters(self, content):self.content = content# 结束解析xmldef endElement(self, name):if name == "Language":print(self.content)elif name == "Math":print(self.content)elif name == "English":print(self.content)# xml结束标签调用def endDocument(self):print("******配置文件解析结束******")if __name__ == "__main__":# 创建一个 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")
打印结果如下:
******解析配置文件开始******
第六中学
2年级
优秀
一般
优秀
5年级
优秀
一般
优秀
第九中学
1年级
优秀
一般
优秀
3年级
优秀
一般
优秀
******配置文件解析结束******
最后总结,python 使用sax 读取xml 不难,可能存在组合数据的时候出现数据重现的问题,这个可以在拼接完数据之后,清空一下数据源,试试看,由于需求不一样,这里就不在写各种需求的组合数据了,大家注意一下数据重复问题即可。
python 使用sax 解析xml 文件相关推荐
- 使用SAX解析XML文件
关于使用SAX解析XML文件也没什么要说明的,直接上代码吧. 关键如下: public class PersonHandler extends DefaultHandler {private Stri ...
- android xml defaulthandler解析,sax解析xml文件的DefaultHandler处理类
一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个"你"当作android:),使用sax解析 ...
- SAX 解析XML文件:将XML转换成Java对象
本博客介绍的是解析本地XML文件,解析网络上的XML 本文写得比较简略,实际上项目应用更多的是解析网上的xml资源 使用SAX 处理XML需要一个Handler 对象,一般继承org.xml.sax, ...
- SAX解析XML文件
就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方 ...
- android xml解析demo,Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)...
转载请注明出处:http://blog.csdn.net/droyon/article/details/9346657 Sax解析xml 以下是测试Demo 运行程序类 public class Te ...
- python使用ElementTree解析XML文件
一.将XML网页保存到本地 要加载XML文件首先应该将网页上的信息提取出来,保存为本地XML文件.抓取网页信息可以python的urllib模块. 代码如下: from urllib import u ...
- android用sax解析xml,详解android使用SAX解析XML文件
解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个 ...
- python读取xml_python解析xml文件
加载和读取xml文件 import xml.dom.minidom doc = xml.dom.minidom.parse(xmlfile) 获取xml文档对象(对子节点和节点node都适用) roo ...
- Android开发--详解SAX解析XML文件
SAX技术字处理XML文件时并不是一次性把XML文件装入内存,而是一边读一边解析,因此,在解析的过程中会有几个步骤需要注意,在这里用一张图来表示解析的步骤: 在本实例中,定义了一个xml文件,其中有若 ...
最新文章
- java threas.jion_Java Thread.join详解
- maven WEB项目启动没问题访问页面就报错:org.apache.jasper.JasperException: Unable to compile class for JSP
- EventLoop 的启动
- Windows Phone 7项目实战之记事本(二)
- DevExpress VCL Controls v15.1.5正式发布[附下载]
- GitHub上README.md教程(copy)
- 让 CefSharp.WinForms 应用程序同时支持32位(x86)和64位(x64)的解决方案
- 各高校寒假时间公布_高校放假哪家长?多所高校寒假时间公布!
- WPF中制作立体效果的文字或LOGO图形
- 微信小程序快速开发上手
- 微课|玩转Python轻松过二级(1.3节):编码规范与代码优化建议1
- 【干货】推荐技术分享-多业务融合推荐实践与思考.pdf(附50页ppt下载链接)
- 在Ubuntu中下载github上的文件
- 前端+后端实现导入功能
- 微信小程序实现随机标签云
- 微软中国招聘职位描述(英文)
- 虚拟机下的SYN Flood测试
- java中explain什么意思_explain关键字使用解释
- urchin的安装及使用
- android蓝牙配对加连接,android – 配对设备的蓝牙自动连接