Python解析XML,sax模块的介绍

来源:互联网 发布:淘宝古着店推荐 编辑:程序博客网 时间:2024/05/02 02:02

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 text="异常标志">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","","免疫室","乙肝二对半","乙型肝炎核心抗体测定","阴性","",""
原创粉丝点击