您的位置:首页 > 编程语言 > Python开发

Python解析XML,sax模块的介绍

2017-10-26 10:34 645 查看
XML介绍:

XML(eXtensible Markup Language)指可扩展标记语言,被设计用来传输和存储数据,已经日趋成为当前许多新生技术的核心,在不同的领域都有着不同的应用。它是web发展到一定阶段的必然产物,既具有SGML的核心特征,又有着HTML的简单特性,还具有明确和结构良好等许多新的特性。

sax模块:

SAX是一种基于事件驱动的API,利用SAX解析XML牵涉到两个部分:解析器和事件处理器。其中解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。常使用在如下的情况下:一、对大型文件进行处理;二、只需要文件的部分内容,或者只需从文件中得到特定信息;三、想建立自己的对象模型的时候。

ContentHandler类方法介绍

(1)characters(content)方法

调用时机:

从行开始,遇到标签之前,存在字符,content的值为这些字符串。

从一个标签,遇到下一个标签之前, 存在字符,content的值为这些字符串。

从一个标签,遇到行结束符之前,存在字符,content的值为这些字符串。

标签可以是开始标签,也可以是结束标签。

(2)startDocument()方法

文档启动的时候调用。

(3)endDocument()方法

解析器到达文档结尾时调用。

(4)startElement(name, attrs)方法

遇到XML开始标签时调用,name是标签的名字,attrs是标签的属性值字典。

(5)endElement(name)方法

遇到XML结束标签时调用。

在CODE上查看代码片派生到我的代码片

代码及原始数据:

原始数据:

<?xml-stylesheet type="text/xsl" href="TJDA_GR.xsl" ?>
<grtj>
<jbxx text="基本信息">
<tjbh text="体检编号">XXXXXXX</tjbh>
<name text="姓名">XXX</name>
<sex text="性别">女</sex>
<age text="年龄">19</age>
<sfzh text="身份证号"/>
</jbxx>
<data text="体检情况">
<ksmc text="生化室">
<xiangmu1 text="肝功能常规(5项目)">
<xiangmu2 text="白蛋白">
<jg text="结果">46.9</jg>
<dw text="单位">g/L</dw>
<ckfw text="参考范围">35-55</ckfw>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
<xiangmu2 text="白球比">
<jg text="结果">1.99</jg>
<dw text="单位"/>
<ckfw text="参考范围">1-2.5</ckfw>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
<xiangmu2 text="谷丙转氨酶">
<jg text="结果">39.0</jg>
<dw text="单位">U/L</dw>
<ckfw text="参考范围">0-40</ckfw>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
<xiangmu2 text="谷草转氨酶">
<jg text="结果">38.0</jg>
<dw text="单位">U/L</dw>
<ckfw text="参考范围">0-40</ckfw>
<ycts text="异常提示"/>
<ycbz t
10d8b
ext="异常标志">0</ycbz>
</xiangmu2>
<xiangmu2 text="球蛋白">
<jg text="结果">23.6</jg>
<dw text="单位">g/l</dw>
<ckfw text="参考范围">20-35</ckfw>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
<xiangmu2 text="总蛋白">
<jg text="结果">70.5</jg>
<dw text="单位">g/L</dw>
<ckfw text="参考范围">60-80</ckfw>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
</xiangmu1>
<xj text="小结">
<xjqk text="小结情况">未见异常</xjqk>
<xjys text="小结医生">XXX</xjys>
<xjrq text="小结日期">2009-02-12</xjrq>
</xj>
</ksmc>
<ksmc text="免疫室">
<xiangmu1 text="乙肝二对半">
<xiangmu2 text="乙型肝炎e抗体测定">
<jg text="结果">阴性</jg>
<dw text="单位"/>
<ckfw text="参考范围"/>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
<xiangmu2 text="乙型肝炎e抗原测定">
<jg text="结果">阴性</jg>
<dw text="单位"/>
<ckfw text="参考范围"/>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
<xiangmu2 text="乙型肝炎表面抗体测定">
<jg text="结果">阴性</jg>
<dw text="单位"/>
<ckfw text="参考范围"/>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
<xiangmu2 text="乙型肝炎表面抗原测定">
<jg text="结果">阴性</jg>
<dw text="单位"/>
<ckfw text="参考范围"/>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
<xiangmu2 text="乙型肝炎核心抗体测定">
<jg text="结果">阴性</jg>
<dw text="单位"/>
<ckfw text="参考范围"/>
<ycts text="异常提示"/>
<ycbz text="异常标志">0</ycbz>
</xiangmu2>
</xiangmu1>
<xj text="小结">
<xjqk text="小结情况">乙肝免疫学检查全阴;</xjqk>
<xjys text="小结医生">XX</xjys>
<xjrq text="小结日期">2009-02-12</xjrq>
</xj>
</ksmc>
</data>
<zj text="总检">
<zs text="综述">1、免疫室:
乙肝免疫学检查全阴;
</zs>
<jy text="建议">1、免疫室:
[乙肝五项阴性]   说明您对乙肝病毒没有抵抗力,容易被传染,建议您注射乙肝疫苗。
</jy>
<zjys text="总检医生">XX</zjys>
<zjrq text="总检日期">2009-02-12</zjrq>
</zj>
</grtj>


部分代码:

def startElement(self, tag, attrs):
if tag == "ksmc":
self.dict['ksmc'] = attrs["text"]

if tag == "xiangmu1":
self.dict['xiangmu1'] = attrs["text"]

if tag == "xiangmu2":
# 在清除字典前获取体检编号
if 'tjbh' in self.item:
tjbh = self.item['tjbh']
self.dict['tjbh'] = tjbh
if 'name' in self.item:
name = self.item['name']
self.dict['name'] = name
if 'sex' in self.item:
sex = self.item['sex']
self.dict['sex'] = sex

if 'age' in self.item:
age = self.item['age']
self.dict['age'] = age

if 'sfzh' in self.item:
sfzh = self.item['sfzh']
self.dict['sfzh'] = sfzh

self.item = {}  # 清空字典
self.xiamgmu2 = attrs["text"]
self.item['xiamgmu2'] = attrs["text"]
# 加进去科室,项目
self.item.update(self.dict)

self.current_tag = tag
self.in_quote = 1

def characters(self,content):

if self.in_quote:
self.item.update({self.current_tag: content}) # 此处是把那些标签添加到字典中
# print 'z',self.item

def endElement(self, tag):
#以该标签结尾  代表读取一个标签的信息结束
if tag == "xiangmu2":
in_fields = tuple([ ('"' + self.item.get(i,"") + '"')  for i in fields ])
#此处进行相应的操作可以写成文件,插进数据库

self.in_quote = 0


结果:

"tjbh","name","sex","age","sfzh","ksmc","xiangmu1","xiamgmu2","jg","dw","ckfw"
"100000003","xxx","女","19","","生化室","肝功能常规(5项目)","白蛋白","46.9","g/L","35-55"
"100000003","xxx","女","19","","生化室","肝功能常规(5项目)","白球比","1.99","","1-2.5"
"100000003","xxx","女","19","","生化室","肝功能常规(5项目)","谷丙转氨酶","39.0","U/L","0-40"
"100000003","xxx","女","19","","生化室","肝功能常规(5项目)","谷草转氨酶","38.0","U/L","0-40"
"100000003","xxx","女","19","","生化室","肝功能常规(5项目)","球蛋白","23.6","g/l","20-35"
"100000003","xxx","女","19","","生化室","肝功能常规(5项目)","总蛋白","70.5","g/L","60-80"
"100000003","xxx","女","19","","免疫室","乙肝二对半","乙型肝炎e抗体测定","阴性","",""
"100000003","xxx","女","19","","免疫室","乙肝二对半","乙型肝炎e抗原测定","阴性","",""
"100000003","xxx","女","19","","免疫室","乙肝二对半","乙型肝炎表面抗体测定","阴性","",""
"100000003","xxx","女","19","","免疫室","乙肝二对半","乙型肝炎表面抗原测定","阴性","",""
"100000003","xxx","女","19","","免疫室","乙肝二对半","乙型肝炎核心抗体测定","阴性","",""
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python xml 数据挖掘