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 ...
随机推荐
- Android平台的四大天王:Activity, Service, ContentProvider, BroadcastReceiver
今天开始要自学android,刚看到百度知道上面这段话,觉得不错(不过已经是2011年8月的回答了): Android系统的手机的每一个你能看到的画面都是一个activity,它像是一个画布,随你在上 ...
- wsdlLocation可以写成项目的相对路劲吗
如果客户端的代码使用wsdl生成的话,这个地址是从wsdl描述的<service>里的<location>获取的,如果开发过程中服务地址换了,那只能手工来修改了,好像只有一个地 ...
- 简单的SqlHelper
namespace Login { class SqlHelper { //连接数据库的字符串 //static string dataConnection = "server=***-PC ...
- cas sso单点登录系列8_抛弃Https让Cas以Http协议提供单点登录服务
转:http://blog.csdn.net/ycyk_168/article/details/18668951 本文环境: 1.apache-tomcat-7.0.50-windows-x86 2. ...
- HTML TAG FROM MDN
A <a> <abbr> <acronym> <address> <applet> <area> <article> ...
- wpf样式绑定 行为绑定 事件关联 路由事件实例
代码说明:我要实现一个这样的功能 有三个window窗口 每个窗体有一个label标签 当我修改三个label标签中任意一个字体颜色的时候 其他的label标签字体颜色也变化 首先三个窗体不用 ...
- [开源]jquery-ajax-cache:快速优化页面ajax请求,使用localStorage缓存请求
项目:jquery-ajax-cache 地址:https://github.com/WQTeam/jquery-ajax-cache 最近在项目中用到了本地缓存localStorage做数据 ...
- access_token的获取方式
获取Access Token $appid = ""; $appsecret = ""; $url = "https://api.weixin.q ...
- linux 下面 opcache 拓展
PHP 5.5.0 及后续版本中已经绑定了 OPcache 扩展,只需要在编译安装的时候, 如果你使用--disable-all参数 禁用了默认扩展的构建, 那么必须使用--enable-opcach ...
- CSS响应式web设计
参考 1. 响应式web设计之CSS3 Media Queries http://www.cnblogs.com/mofish/archive/2012/05/23/2515218.html 2. 用 ...