[转载] python 解析xml 文件: SAX方式
环境
python:3.4.4
准备xml文件
首先新建一个xml文件,countries.xml。内容是在python官网上看到的。

<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>

准备python文件
新建一个test_SAX.py,用来解析xml文件。

#!/usr/bin/python
# -*- coding: UTF-8 -*- import xml.sax class CountryHandler( xml.sax.ContentHandler ):
def __init__(self):
self.CurrentData = ""
self.CurrentAttributes = ""
self.rank = ""
self.year = ""
self.gdppc = ""
self.nei_name = ""
self.nei_dire = "" def startElement(self, tag, attributes):
self.CurrentData = tag
self.CurrentAttributes = attributes
if tag == "country":
print ("*****Country*****")
name = attributes["name"]
print ("Name:", name)
if tag == "neighbor":
self.nei_name = attributes["name"]
self.nei_dire = attributes["direction"] def endElement(self, tag):
if self.CurrentData == "rank":
print ("Rank:", self.rank)
elif self.CurrentData == "year":
print ("Year:", self.year)
elif self.CurrentData == "gdppc":
print ("Gdppc:", self.gdppc)
elif self.CurrentData == "neighbor":
print ("Neighbor:", self.nei_name,self.nei_dire)
self.CurrentData = ""
self.nei_name = ""
self.nei_dire = "" def characters(self, content):
if self.CurrentData == "rank":
self.rank = content
elif self.CurrentData == "year":
self.year = content
elif self.CurrentData == "gdppc":
self.gdppc = content if __name__ == "__main__":
parser = xml.sax.make_parser()
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
Handler = CountryHandler()
parser.setContentHandler( Handler )
parser.parse("countries.xml")

执行结果

>python test_SAX.py
*****Country*****
Name: Liechtenstein
Rank: 1
Year: 2008
Gdppc: 141100
Neighbor: Austria E
Neighbor: Switzerland W
*****Country*****
Name: Singapore
Rank: 4
Year: 2011
Gdppc: 59900
Neighbor: Malaysia N
*****Country*****
Name: Panama
Rank: 68
Year: 2011
Gdppc: 13600
Neighbor: Costa Rica W
Neighbor: Colombia E

备注
SAX是一种基于事件驱动的API。
SAX主要包括三种对象: readers,handlers 以及 input sources。即解析器,事件处理器以及输入源。
解析器负责读取输入源,如xml文档,并向事件处理器发送事件,如元素开始和元素结束事件。
事件处理器负责处理事件,对xml文档数据进行处理。
parser = xml.sax.make_parser()
新建并且返回一个 SAX XMLReader 对象。
参见: https://docs.python.org/2/library/xml.sax.html
xml.sax.make_parser([parser_list])
Create and return a SAX XMLReader object. The first parser found will be used. If parser_list is provided, it must be a sequence of strings which name modules that have a function named create_parser(). Modules listed in parser_list will be used before modules in the default list of parsers.
parser.setFeature(xml.sax.handler.feature_namespaces, 0)
设置xml.sax.handler.feature_namespaces值为0。其实就是关闭 namespace模式。
参见:https://docs.python.org/2/library/xml.sax.reader.html
XMLReader.setFeature(featurename, value)
Set the featurename to value. If the feature is not recognized, SAXNotRecognizedException is raised. If the feature or its setting is not supported by the parser, SAXNotSupportedException is raised.
class CountryHandler( xml.sax.ContentHandler )
SAX API 定义了4种handler:content handler,DTD handler,error handlers,和 entity resolvers。
程序只需要实现自己感兴趣的事件的接口,比如我们这里只实现了 ContentHandler接口里的部分方法。
class xml.sax.handler.ContentHandler
This is the main callback interface in SAX, and the one most important to applications. The order of events in this interface mirrors the order of the information in the document.
ContentHandler 有很多方法。具体可参见: https://docs.python.org/2/library/xml.sax.handler.html#contenthandler-objects
我们这里首先新建一个CountryHandler类,继承自 xml.sax.ContentHandler。然后实现了他的 startElement(),endElement() 以及 characters()方法。
def startElement(self, tag, attributes)
遇到XML开始标签时调用。tag是标签的名字,attributes 是标签的属性值字典。

Signals the start of an element in non-namespace mode. The name parameter contains the raw XML 1.0 name of the element type as a string and the attrs parameter holds an object of the Attributes interface (see The Attributes Interface) containing the attributes of the element. The object passed as attrs may be re-used by the parser; holding on to a reference to it is not a reliable way to keep a copy of the attributes. To keep a copy of the attributes, use the copy() method of the attrs object.

def endElement(self, tag)
遇到XML结束标签时调用。tag是标签的名字。
Signals the end of an element in non-namespace mode.
The name parameter contains the name of the element type, just as with the startElement() event.
def characters(self, content)
遇到XML元素内容时调用。content为元素的内容值。

Receive notification of character data. The Parser will call this method to report each chunk of character data. SAX parsers may return all contiguous character data in a single chunk, or they may split it into several chunks; however, all of the characters in any single event must come from the same external entity so that the Locator provides useful information. content may be a Unicode string or a byte string; the expat reader module produces always Unicode strings.

parser.setContentHandler( Handler )
设置当前的ContentHandler为我们自己写的handler实例。如果不进行设置,content 事件会被忽略。
参见:https://docs.python.org/2/library/xml.sax.reader.html
XMLReader.setContentHandler(handler)¶
Set the current ContentHandler. If no ContentHandler is set, content events will be discarded.
parser.parse("countries.xml")
开始解析 xml文件。
参见:https://docs.python.org/2/library/xml.sax.reader.html
Process an input source, producing SAX events. The source object can be a system identifier (a string identifying the input source – typically a file name or an URL), a file-like object, or an InputSource object. When parse() returns, the input is completely processed, and the parser object can be discarded or reset. As a limitation, the current implementation only accepts byte streams; processing of character streams is for further study.
[转载] python 解析xml 文件: SAX方式的更多相关文章
- python 解析xml 文件: SAX方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- python 解析xml 文件: DOM 方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- android解析xml文件的方式
android解析xml文件的方式 作者:东子哥 ,发布于2012-11-26,来源:博客园 在androd手机中处理xml数据时很常见的事情,通常在不同平台传输数据的时候,我们就可能使用xm ...
- JAVA解析XML之SAX方式
JAVA解析XML之SAX方式 SAX解析xml步骤 通过SAXParseFactory的静态newInstance()方法获取SAXParserFactory实例factory 通过SAXParse ...
- Java解析XML文件的方式
在项目里,我们往往会把一些配置信息放到xml文件里,或者各部门间会通过xml文件来交换业务数据,所以有时候我们会遇到“解析xml文件”的需求.一般来讲,有基于DOM树和SAX的两种解析xml文件的方式 ...
- python 解析xml 文件: Element Tree 方式
环境 python:3.4.4 准备xml文件 首先新建一个xml文件,countries.xml.内容是在python官网上看到的. <?xml version="1.0" ...
- PYTHON解析XML的多种方式效率对比实测
在最初学习PYTHON的时候,只知道有DOM和SAX两种解析方法,但是其效率都不够理想,由于需要处理的文件数量太大,这两种方式耗时太高无法接受. 在网络搜索后发现,目前应用比较广泛,且效率相对较高的E ...
- 【TensorFlow】Python解析xml文件
最近在项目中使用TensorFlow训练目标检测模型,在制作自己的数据集时使用了labelimg软件对图片进行标注,产生了VOC格式的数据,但标注生成的xml文件标签值难免会产生个别错误造成程序无法跑 ...
- 遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件
XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...
随机推荐
- 协议类接口 - I2C
一.12c总线概述 I2C( Inter-Integrated Circuit,又称IIC)总线是一种串行总线,用 于连接微控制器及其外围设备,硬件图非常简单:一条串行数据线(SDA),一条串行时钟线 ...
- 蓝牙实现对等网络连接 <GameKit/GameKit.h>
/* 1.设置UI界面 2.引入框架 3.点击选择照片 4.连接蓝牙设备 5.实现蓝牙的代理方法 6.发送照片 */ #import "ViewController.h" #imp ...
- c#数据库连接池Hikari重构升级
Hikari是我自定义的数据库连接池,前面已经提供了地址.因为c#的连接池按照规范的ADO.NET里面实现定义的.由数据库官方提供,但是实现方式就不知道了,反正没有看出来,估计一般是连接类实现的,但是 ...
- oracle的事务隔离级别和读一致性
oracle提供了三个隔离级别: 1.读提交 ,简而言之只能读取语句开始执行前提交的数据 2.串行,这个好理解,就是事务串行运行,避免经典的三个场景-脏读.不可重复读.幻读. 3.只读,oracle已 ...
- 构建高可靠hadoop集群之4-权限指引
此文翻译自http://hadoop.apache.org/docs/r2.8.0/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html ...
- input输入框类型
输入大小写字母.数字.下划线: <input type="text" onkeyup="this.value=this.value.replace(/[^\w_]/ ...
- 开发必备知识点--django项目启动时,url加载之前,执行某个.py文件
django项目启动时,自定义执行某个py文件 在任意的app下的apps.py中的Config类下自定义ready()方法,并且调用autodiscover_modules. app01/apps. ...
- Python3 logging模块&ConfigParser模块
''' 博客园 Infi_chu ''' ''' logging模块 该模块是关于日志相关操作的模块 ''' import logging # logging.debug('debug') # log ...
- UVA - 12230
#include <bits/stdc++.h> using namespace std; int n; double d; double p,l,v,ret,sum; ; /* 村庄A, ...
- Python3.6中PyInstaller不能对文件进行打包问题
上篇文章<itchat和matplotlib的结合使用爬取微信信息>是用python爬取信息得到微信朋友的信息,并且用matplotlib统计信息进行画图,所以今天想将它打包成.exe可执 ...