Python—使用xml.sax解析xml文件

什么是sax?

SAX是一种基于事件驱动的API。

利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。

解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;

而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。

sax适于处理下面的问题:

  • 1、对大型文件进行处理;
  • 2、只需要文件的部分内容,或者只需从文件中得到特定信息;
  • 3、想建立自己的对象模型的时候。

在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。

movies.xml:需要解析的xml文件,上一篇博客中使用dom解析的一样

<collection shelf="New Arrivals">
<movie title="Enemy Behind">
   <type>War, Thriller</type>
   <format>DVD</format>
   <year>2003</year>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Talk about a US-Japan war</description>
</movie>
<movie title="Transformers">
   <type>Anime, Science Fiction</type>
   <format>DVD</format>
   <year>1989</year>
   <rating>R</rating>
   <stars>8</stars>
   <description>A schientific fiction</description>
</movie>
<movie title="Trigun">
   <type>Anime, Action</type>
   <format>DVD</format>
   <episodes>4</episodes>
   <rating>PG</rating>
   <stars>10</stars>
   <description>Vash the Stampede!</description>
</movie>
<movie title="Ishtar">
   <type>Comedy</type>
   <format>VHS</format>
   <rating>PG</rating>
   <stars>2</stars>
   <description>Viewable boredom</description>
</movie>
</collection>

xmltest.py:解析代码如下

# -*- coding:UTF-8 -*-

‘‘‘
Created on 2015年9月10日

@author: xiaowenhui
‘‘‘

import xml.sax

#第二种方法,sax解析
class MovieHandler(xml.sax.ContentHandler):  #继承于xml.sax.ContentHandler类

    def __init__(self):
        self.CurrentData = ""
        self.type = ""
        self.format = ""
        self.year = ""
        self.episodes = ""
        self.rating = ""
        self.stars = ""
        self.description = ""
        self.title = ""

    # 元素开始事件处理
    def startElement(self, tag, attributes):
        self.CurrentData = tag
        if tag == "movie":
            print "*****Movie*****"
            self.title = attributes["title"]
            print "Title:", self.title

    # 内容事件处理
    def characters(self, content):
        if self.CurrentData == "type":
            self.type = content
        elif self.CurrentData == "format":
            self.format = content
        elif self.CurrentData == "year":
            self.year = content
        elif self.CurrentData == "episodes":
            self.episodes = content
        elif self.CurrentData == "rating":
            self.rating = content
        elif self.CurrentData == "stars":
            self.stars = content
        elif self.CurrentData == "description":
            self.description = content

    # 元素结束事件处理
    def endElement(self, tag):
        if self.CurrentData == "type":
            print "Type:", self.type
        elif self.CurrentData == "format":
            print "Format:", self.format
        elif self.CurrentData == "year":
            print "Year:", self.year
        elif self.CurrentData == "episodes":
            print "Episodes:", self.episodes
        elif self.CurrentData == "rating":
            print "Rating:", self.rating
        elif self.CurrentData == "stars":
            print "Stars:", self.stars
        elif self.CurrentData == "description":
            print "Description:", self.description

# 创建一个 XMLReader
parser = xml.sax.make_parser()
# turn off namepsaces
parser.setFeature(xml.sax.handler.feature_namespaces, 0)

# 重写 ContextHandler
Handler = MovieHandler()
parser.setContentHandler( Handler )

parser.parse("movies.xml")

输出结果如下:

疑问:不知道为什么会多输出一个description,可能是sax解析的时候哪里写的不对,现在还没找到原因,我把

 elif self.CurrentData == "description":
 print "Description:", self.description

改成
 elif self.CurrentData == "description":
 print  self.description后就没有输出“description”,只输出了self.description这个参数
*****Movie*****
Title: Enemy Behind
Type: War, Thriller
Format: DVD
Year: 2003
Rating: PG
Stars: 10
description: Talk about a US-Japan war
description: 

*****Movie*****
Title: Transformers
Type: Anime, Science Fiction
Format: DVD
Year: 1989
Rating: R
Stars: 8
description: A schientific fiction
description: 

*****Movie*****
Title: Trigun
Type: Anime, Action
Format: DVD
Episodes: 4
Rating: PG
Stars: 10
description: Vash the Stampede!
description: 

*****Movie*****
Title: Ishtar
Type: Comedy
Format: VHS
Rating: PG
Stars: 2
description: Viewable boredom
description: 

description: 
时间: 2024-10-29 19:07:32

Python—使用xml.sax解析xml文件的相关文章

Python:使用基于事件驱动的SAX解析XML

SAX的特点: 是基于事件的 API 在一个比 DOM 低的级别上操作 为您提供比 DOM 更多的控制 几乎总是比 DOM 更有效率 但不幸的是,需要比 DOM 更多的工作 基于对象和基于事件的接口 您可能已经知道语法分析器有两类接口 - 基于对象的(如:DOM)和基于事件(如:SAX)的接口. DOM是基于对象的语法分析器的标准 API. 作为基于对象的接口,DOM 通过在内存中显示地构建对象树来与应用程序通信.对象树是 XML 文件中元素树的精确映射. DOM 易于学习和使用,因为它与基本

SAX解析XML文件

SAX是Simple API for XML的缩写,它并不是由W3C官方所提出的标准.SAX是一种轻量型的方法,不像DOM解析时,把XML文档全部载入内存中,在PC上操作,Dom还有 优势,但在手机中端上则无优势,因为手机内存和硬件都比不上PC强.使用 SAX 是比较安全的,并且 Android 提供了一种传统的 SAX 使用方法,以及一个便捷的 SAX 包装器.SAX采用基于事件驱动的处理方式,它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理. 在SAX接口中,事件源是org

JAVA SAX解析XML文件

[代码] [Java]代码view sourceprint?001package SAXparse;002 003 004import java.io.FileInputStream;005import java.lang.reflect.Array;006import java.lang.reflect.InvocationTargetException;007import java.lang.reflect.Method;008import java.text.ParseException;

SAX解析XML文件实例代码

import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.s

cocos2d-x 3.0 使用Sax解析xml文件(中国显示器问题解决)

今天是个好日子.我以为事情可以变得,明天是个好日子.打开门儿春风... 恩,听着歌写文档生活就是这么享受. 今天曾经的邻居大神突然在qq上赞了我一下,这让我异常激动啊.. 这还要从前前前几天说起,那会无意间看到cocos微信上的一个实话实说活动.反正就是參加了能够抽奖这样子啦.没错.我就是本着那官方T恤去的,本着分子越大分母越大抽奖几率越大的原则,然后就连着发了一番感慨.并且还都是比較罗嗦,没想到隔天cocos君居然给我回复了,中奖了有木有,cocos2dx的官方T恤,哈哈. .然后就是曾经的大

安卓SAX解析XML文件

XML文件常用的解析方式有DOM解析,SAX解析. 一.Sax SAX(simpleAPIforXML)是一种XML解析的替代方法.相比于DOM,SAX是一种速度更快,更有效的方法.它逐行扫描文档,一边扫描一边解析.而且相比于DOM,SAX可以在解析文档的任意时刻停止解析,但任何事物都有其相反的一面,对于SAX来说就是操作复杂.SAX解析XML文档采用事件驱动模式.什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理.基于事件驱动的处理模式主要是基于事件源和事件

SAX解析XML

SAX 事件处理(事件驱动),不需要载入整个文档,流机制读取,分析XML文档 startDocument startElement character endElement endDocument 当sax扫描到文档时就调用startDocument函数,sax扫描到文档结束符时就调用endDocument函数,也就是说当sax扫描到哪个节点时就会调用相应的函数,同时还会携带节点的属性值. 当它扫描到节点内容值时就会调用character函数 Sax主要是用来对xml文件遍历,解析,不提供修改.

6. SAX解析XML

SAX解析: SAX采用事件处理的方式解析XML文件,利用 SAX 解析 XML 文档,涉及两个部分: 解析器和事件处理器 : 1. 解析器可以使用SAXP的API创建,创建出SAX解析器后, 就可以指定解析器去解析某个XML文档. 解析器采用SAX方式在解析某个XML文档时, 它只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法, 解析器在调用事件处理器的方法时, 会把当前解析到的xml文件内容作为方法的参数传递给事件处理器. 2. 事件处理器由程序员编写,程序员通过事件处理器

XML学习笔记(二):使用 DOM和SAX 解析XML :

一.XML解析的简介 1.一般来说xml解析的方式有两种,Dom与SAX,且各有优缺点.pull是第三种方法见:pull解析XML 1)DOM:dom对象树 ①.整个XML放入内存,转换为Document对象: ②.每个元素,转换成Element对象 ③.文本,转换成Text对象 ④.属性,转换成Attribute对象 优缺点:元素的CRUD比较简单,但是内存消耗大,大的xml文档不适合. 补充:内存不足时,可以修改参数,调整JVM的内存大小 1.java.lang.OutOfMemoryErr