您的位置:首页 > 其它

xml数据处理--sax模块使用

2014-04-29 09:30 531 查看
1.xml文件的数据如下:

<PERSONS>
<haha>
<person>
<id>100000</id>
<sex>男</sex>
<address>北京,海淀区</address>
<fansNum>437</fansNum>
<summary>1989</summary>
<wbNum>333</wbNum>
<gzNum>242</gzNum>
<blog>null</blog>
<edu>大学</edu>
<work></work>
<renZh>1</renZh>
<brithday>2月14日</brithday>
</person>
<person>
<id>100001</id>
<sex>男</sex>
<address>北京,海淀区</address>
<fansNum>427</fansNum>
<summary>1991</summary>
<wbNum>333</wbNum>
<gzNum>242</gzNum>
<blog>null</blog>
<edu>大学</edu>
<work></work>
<renZh>1</renZh>
<brithday>3月14日</brithday>
</person>
</haha>
</PERSONS>


现要将个人数据保存到文件,使用sax模块进行处理,代码如下。

# coding: utf-8
import sys,os
reload(sys)
sys.setdefaultencoding('utf-8')
from xml.sax import handler,parseString
class PersonHandler(handler.ContentHandler):
def __init__(self,fp):
self.fp = fp
self.person = []
self.current_tag = ""
self.flag = 0
def startElement(self, name, attr):
if name == "person":
self.person = []
self.current_tag = name
self.flag = 1
def endElement(self, name):
if name == "person":
for value in self.person:
if value.keys()[0] != 'person':
print >>self.fp,value.keys()[0]+":"+str(value.values()[0])+"|",
print >>self.fp
self.flag = 0
def characters(self, content):
if self.flag:
self.person.append({self.current_tag: content})
if __name__ == "__main__":
f = open("1.xml")
fp = open('data','w')
parseString(f.read(), PersonHandler(fp))
f.close()
fp.close()


xml.sax中主要有两个函数用来处理xml。

parse(source,handler,errorHandler=<xml.sax.handler.ErrorHandler instance>)
source:file object、file-like object。
handler:ContentHandler、child class for ContentHandler。

parseString(string,handler,errorHandler=<xml.sax.handler.ErrorHandler instance>)

区别:区别主要在于数据的来源,第一个函数数据来源于IO数据流,第二个函数来源于字符串。
xml.sax默认的handler是ContentHandler,这个handler包含了事件回调器。一般会对这个类的回调器进行重写来进行数据处理。

expat的解析过程与sax类似,稍后会有关于expat的使用方法介绍,你会发现用法非常

相似。

本文出自 “fly天地” 博客,请务必保留此出处http://liuping0906.blog.51cto.com/2516248/1404318
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: