这里不是说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 文件相关推荐

  1. 使用SAX解析XML文件

    关于使用SAX解析XML文件也没什么要说明的,直接上代码吧. 关键如下: public class PersonHandler extends DefaultHandler {private Stri ...

  2. android xml defaulthandler解析,sax解析xml文件的DefaultHandler处理类

    一千年的时光,我无数次掀起岁月的帷幔,只为和你,在某一个平静如水的日子相遇,然后相识,倾情一生,缱绻一世,好美的散文,好吧,我情愿把这个"你"当作android:),使用sax解析 ...

  3. SAX 解析XML文件:将XML转换成Java对象

    本博客介绍的是解析本地XML文件,解析网络上的XML 本文写得比较简略,实际上项目应用更多的是解析网上的xml资源 使用SAX 处理XML需要一个Handler 对象,一般继承org.xml.sax, ...

  4. SAX解析XML文件

    就目前来说,有三种方式可以解析XML文件:DOM.SAX.StAX.DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方 ...

  5. android xml解析demo,Android解析自定义xml文件--Sax解析xml文件,测试demo(方案二)...

    转载请注明出处:http://blog.csdn.net/droyon/article/details/9346657 Sax解析xml 以下是测试Demo 运行程序类 public class Te ...

  6. python使用ElementTree解析XML文件

    一.将XML网页保存到本地 要加载XML文件首先应该将网页上的信息提取出来,保存为本地XML文件.抓取网页信息可以python的urllib模块. 代码如下: from urllib import u ...

  7. android用sax解析xml,详解android使用SAX解析XML文件

    解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析. DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了. 优点:整个 ...

  8. python读取xml_python解析xml文件

    加载和读取xml文件 import xml.dom.minidom doc = xml.dom.minidom.parse(xmlfile) 获取xml文档对象(对子节点和节点node都适用) roo ...

  9. Android开发--详解SAX解析XML文件

    SAX技术字处理XML文件时并不是一次性把XML文件装入内存,而是一边读一边解析,因此,在解析的过程中会有几个步骤需要注意,在这里用一张图来表示解析的步骤: 在本实例中,定义了一个xml文件,其中有若 ...

最新文章

  1. java threas.jion_Java Thread.join详解
  2. maven WEB项目启动没问题访问页面就报错:org.apache.jasper.JasperException: Unable to compile class for JSP
  3. EventLoop 的启动
  4. Windows Phone 7项目实战之记事本(二)
  5. DevExpress VCL Controls v15.1.5正式发布[附下载]
  6. GitHub上README.md教程(copy)
  7. 让 CefSharp.WinForms 应用程序同时支持32位(x86)和64位(x64)的解决方案
  8. 各高校寒假时间公布_高校放假哪家长?多所高校寒假时间公布!
  9. WPF中制作立体效果的文字或LOGO图形
  10. 微信小程序快速开发上手
  11. 微课|玩转Python轻松过二级(1.3节):编码规范与代码优化建议1
  12. 【干货】推荐技术分享-多业务融合推荐实践与思考.pdf(附50页ppt下载链接)
  13. 在Ubuntu中下载github上的文件
  14. 前端+后端实现导入功能
  15. 微信小程序实现随机标签云
  16. 微软中国招聘职位描述(英文)
  17. 虚拟机下的SYN Flood测试
  18. java中explain什么意思_explain关键字使用解释
  19. urchin的安装及使用
  20. android蓝牙配对加连接,android – 配对设备的蓝牙自动连接

热门文章

  1. stream流对象的理解及使用
  2. 2022-2028年中国塑料编织品的制造行业市场竞争态势及投资方向分析报告
  3. 【JavaScript总结】JavaScript语法基础:JS高级语法
  4. 【Java 2 Platform Enterprise Edition】基础
  5. Redis缓存穿透击穿雪崩
  6. DeepSpeed超大规模模型训练工具
  7. 如何在CPU上优化GEMM(上)
  8. Nucleus-SE迁移:未实现的设施和兼容性
  9. MySQL基础之select基本查询
  10. 微信小程序tabBar