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(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-minidom模块【解析xml】
- xml解析技术介绍(dom4j,dom,jdom,sax)
- android中sax解析xml 操作介绍
- python 之模块之 xml.dom.minidom解析xml
- Python解析XML简单介绍
- python xml.dom模块解析xml
- python sax 解析XML文件
- 简单介绍使用Python解析并修改XML文档的方法
- 简单介绍使用Python解析并修改XML文档的方法
- python 解析xml 文件: SAX方式
- xml解析之sax解析原理图和技术介绍
- python 模块- 对XML的解析 ElementTree(元素树)
- python类库31[使用SAX来解析xml]
- Python minidom模块(DOM写入和解析XML)
- XML解析【介绍、DOM、SAX详细说明、jaxp、dom4j、XPATH】
- xml解析之sax解析原理图和技术介绍
- python对XML的解析 SAX DOM ElementTree
- [代码笔记] python 之 xml解析_sax:基于事件驱动的解析方式
- python类库31[使用SAX来解析xml]
- Python sax模块(SAX解析XML)