美文网首页
Python XML 解析

Python XML 解析

作者: 极客匠 | 来源:发表于2019-05-08 00:58 被阅读0次

XML指可扩展标记语言extensible markup language
XML被设计用来传输和存储数据

Python 对XML的解析,常见的XML编程接口有DOM、SAX以及ElementTree,这两种接口处理XML文件的方式不同,当然使用场合也不同。

  1. SAX

    Python标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个事件并调用用户定义的回调函数来处理XML文件。

  2. DOM

    将XML数据在内存中解析成一个树,通过对树的操作来解析XML

  3. 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
所属栏目: 年度数据
相关报表: 相关报表

相关文章

网友评论

      本文标题:Python XML 解析

      本文链接:https://www.haomeiwen.com/subject/cycpoqtx.html