XML指可扩展标记语言extensible markup language
XML被设计用来传输和存储数据
Python 对XML的解析,常见的XML编程接口有DOM、SAX以及ElementTree,这两种接口处理XML文件的方式不同,当然使用场合也不同。
-
SAX
Python标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个事件并调用用户定义的回调函数来处理XML文件。
-
DOM
将XML数据在内存中解析成一个树,通过对树的操作来解析XML
-
ElementTree
ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
本节主要讲解:
Python 使用SAX解析XML
利用SAX解析XML文档牵涉到两个部分: 解析器和事件处理器。
解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件。
而事件处理器则负责对事件作出响应,对传递的XML数据进行处理。
- 1、对大型文件进行处理;
- 2、只需要文件的部分内容,或者只需从文件中得到特定信息。
- 3、想建立自己的对象模型的时候。
在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。
ContentHandler类方法介绍
characters(content)方法
调用时机:
从行开始,遇到标签之前,存在字符,content 的值为这些字符串。
从一个标签,遇到下一个标签之前, 存在字符,content 的值为这些字符串。
从一个标签,遇到行结束符之前,存在字符,content 的值为这些字符串。
标签可以是开始标签,也可以是结束标签。
startDocument() 方法
文档启动的时候调用。
endDocument() 方法
解析器到达文档结尾时调用。
startElement(name, attrs)方法
遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。
endElement(name) 方法
遇到XML结束标签时调用。
make_parser方法
以下方法创建一个新的解析器对象并返回。
xml.sax.make_parser([parser_list])
参数说明:
- parser_list - 可选参数,解析器列表
parser方法
以下方法创建一个 SAX 解析器并解析xml文档:
xml.sax.parse( xmlfile, contenthandler[, errorhandler])
参数说明:
- xmlfile - xml文件名
- contenthandler - 必须是一个ContentHandler的对象
- errorhandler - 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象
解析实例
```
<root>
<database>筛选栏目:全部</database>
<data>
<record>
<field name="指标">国内生产总值(亿元)</field>
<field name="地区">全国</field>
<field name="数据时间">2018年</field>
<field name="数值">900309.0</field>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值(亿元)</field>
<field name="地区">全国</field>
<field name="数据时间">2017年</field>
<field name="数值">820754.3</field>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值(亿元)</field>
<field name="地区">全国</field>
<field name="数据时间">2018年</field>
<field name="数值">900309.0</field>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值(亿元)</field>
<field name="地区">全国</field>
<field name="数据时间">2017年</field>
<field name="数值">820754.3</field>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值(不变价)_当季值(亿元)</field>
<field name="地区">全国</field>
<field name="数据时间">2019年第一季度</field>
<field name="数值">195422.2</field>
<field name="所属栏目">季度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值(不变价)_累计值(亿元)</field>
<field name="地区">全国</field>
<field name="数据时间">2019年第一季度</field>
<field name="数值">195422.2</field>
<field name="所属栏目">季度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值_当季值(亿元)</field>
<field name="地区">全国</field>
<field name="数据时间">2019年第一季度</field>
<field name="数值">213432.8</field>
<field name="所属栏目">季度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值_累计值(亿元)</field>
<field name="地区">全国</field>
<field name="数据时间">2019年第一季度</field>
<field name="数值">213432.8</field>
<field name="所属栏目">季度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值增长(百分点)</field>
<field name="地区">全国</field>
<field name="数据时间">2018年</field>
<field name="数值"/>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值增长(百分点)</field>
<field name="地区">全国</field>
<field name="数据时间">2017年</field>
<field name="数值">6.8</field>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值环比增长速度(%)</field>
<field name="地区">全国</field>
<field name="数据时间">2019年第一季度</field>
<field name="数值">1.4</field>
<field name="所属栏目">季度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值指数(上年=100)</field>
<field name="地区">全国</field>
<field name="数据时间">2018年</field>
<field name="数值">106.6</field>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值指数(上年=100)</field>
<field name="地区">全国</field>
<field name="数据时间">2017年</field>
<field name="数值">106.8</field>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值指数(上年=100)</field>
<field name="地区">全国</field>
<field name="数据时间">2018年</field>
<field name="数值">106.6</field>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
<record>
<field name="指标">国内生产总值指数(上年=100)</field>
<field name="地区">全国</field>
<field name="数据时间">2017年</field>
<field name="数值">106.8</field>
<field name="所属栏目">年度数据</field>
<field name="相关报表">相关报表</field>
</record>
</data>
</root>
```
# encoding: UTF-8
import xml.sax
class RecordHandler(xml.sax.ContentHandler):
def __init__(self):
self.CurrentData = ""
self.zhibiao = ""
self.area = ""
self.dataTime = ""
self.data = ""
self.lanb = ""
self.report =""
def startElement(self, tag, attributes):
if tag == "field":
name = attributes["name"]
self.CurrentData = name
def endElement(self, tag):
# print("Tag: ", tag)
if self.CurrentData == "指标":
print("指标:", self.zhibiao)
elif self.CurrentData == "地区":
print("地区:", self.area)
elif self.CurrentData == "数据时间":
print("数据时间:", self.dataTime)
elif self.CurrentData == "数值":
print("数值:", self.data)
elif self.CurrentData == "所属栏目":
print("所属栏目:", self.lanb)
elif self.CurrentData == "相关报表":
print("相关报表:", self.report)
self.CurrentData = ""
def characters(self, content):
# print("current:", content)
if self.CurrentData == "指标":
self.zhibiao = content
elif self.CurrentData == "地区":
self.area = content
elif self.CurrentData == "数据时间":
self.dataTime = content
elif self.CurrentData == "数值":
self.data = content
elif self.CurrentData == "所属栏目":
self.lanb = content
elif self.CurrentData == "相关报表":
self.report = content
if __name__ == "__main__":
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces,0)
Handler = RecordHandler()
parser.setContentHandler(Handler)
parser.parse("/Users/huangdaju/Desktop/ssst.xml")
解析结果:
指标: 国内生产总值(亿元)
地区: 全国
数据时间: 2018年
数值: 900309.0
所属栏目: 年度数据
相关报表: 相关报表
指标: 国内生产总值(亿元)
地区: 全国
数据时间: 2017年
数值: 820754.3
所属栏目: 年度数据
相关报表: 相关报表
指标: 国内生产总值(亿元)
地区: 全国
数据时间: 2018年
数值: 900309.0
所属栏目: 年度数据
相关报表: 相关报表
指标: 国内生产总值(亿元)
地区: 全国
数据时间: 2017年
数值: 820754.3
所属栏目: 年度数据
相关报表: 相关报表
指标: 国内生产总值(不变价)_当季值(亿元)
地区: 全国
数据时间: 2019年第一季度
数值: 195422.2
所属栏目: 季度数据
相关报表: 相关报表
指标: 国内生产总值(不变价)_累计值(亿元)
地区: 全国
数据时间: 2019年第一季度
数值: 195422.2
所属栏目: 季度数据
相关报表: 相关报表
指标: 国内生产总值_当季值(亿元)
地区: 全国
数据时间: 2019年第一季度
数值: 213432.8
所属栏目: 季度数据
相关报表: 相关报表
指标: 国内生产总值_累计值(亿元)
地区: 全国
数据时间: 2019年第一季度
数值: 213432.8
所属栏目: 季度数据
相关报表: 相关报表
指标: 国内生产总值增长(百分点)
地区: 全国
数据时间: 2018年
数值: 213432.8
所属栏目: 年度数据
相关报表: 相关报表
指标: 国内生产总值增长(百分点)
地区: 全国
数据时间: 2017年
数值: 6.8
所属栏目: 年度数据
相关报表: 相关报表
指标: 国内生产总值环比增长速度(%)
地区: 全国
数据时间: 2019年第一季度
数值: 1.4
所属栏目: 季度数据
相关报表: 相关报表
指标: 国内生产总值指数(上年=100)
地区: 全国
数据时间: 2018年
数值: 106.6
所属栏目: 年度数据
相关报表: 相关报表
指标: 国内生产总值指数(上年=100)
地区: 全国
数据时间: 2017年
数值: 106.8
所属栏目: 年度数据
相关报表: 相关报表
指标: 国内生产总值指数(上年=100)
地区: 全国
数据时间: 2018年
数值: 106.6
所属栏目: 年度数据
相关报表: 相关报表
指标: 国内生产总值指数(上年=100)
地区: 全国
数据时间: 2017年
数值: 106.8
所属栏目: 年度数据
相关报表: 相关报表
网友评论