Python解析XML,sax模块的介绍

  • Post author:
  • Post category:python


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","","免疫室","乙肝二对半","乙型肝炎核心抗体测定","阴性","",""



版权声明:本文为qq_38377523原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。