使用Python3的sax去解析xml文件时,遇到丢失换行后的内容的问题

1. xml文件

<?xml version="1.0" encoding="utf-8"?>

<msg>
  <appmsg appid="" sdkver="0">
    <title><![CDATA[参考题答如下:]]></title>
    <des><![CDATA[()不属于商业机会评估需要考虑的因素。
参考答案:国际环境评估]]>
</des>
    <action/>
    <type>5</type>
    <showtype>1</showtype>
    <soundtype>0</soundtype>
    <content><![CDATA[]]></content>
    <contentattr>0</contentattr>
    <url><![CDATA[http://weidian.com/?userid=324579720&wfr=c]]></url>
    <lowurl><![CDATA[]]></lowurl>
    <appattach>
      <totallen>0</totallen>
      <attachid/>
      <fileext/>
      <cdnthumburl><![CDATA[]]></cdnthumburl>
      <cdnthumbaeskey><![CDATA[]]></cdnthumbaeskey>
      <aeskey><![CDATA[]]></aeskey>
    </appattach>
    <extinfo/>
    <sourceusername/>
    <sourcedisplayname><![CDATA[]]></sourcedisplayname>
    <mmreader>
      <category type="0" count="1">
        <name><![CDATA[校查]]></name>
        <topnew>
          <cover><![CDATA[]]></cover>
          <width>336</width>
          <height>215</height>
          <digest><![CDATA[()不属于商业机会评估需要考虑的因素。
参考答案:国际环境评估]]>
</digest>
        </topnew>
        <item>
          <itemshowtype>0</itemshowtype>
          <title><![CDATA[参考题答如下:]]></title>
          <url><![CDATA[http://weidian.com/?userid=324579720&wfr=c]]></url>
          <shorturl><![CDATA[]]></shorturl>
          <longurl><![CDATA[]]></longurl>
          <pub_time>1541060142</pub_time>
          <cover><![CDATA[]]></cover>
          <tweetid/>
          <digest><![CDATA[()不属于商业机会评估需要考虑的因素。
参考答案:国际环境评估]]>
</digest>
          <fileid>0</fileid>
          <sources>
            <source>
              <name><![CDATA[校查]]></name>
            </source>
          </sources>
          <styles/>
          <native_url/>
          <del_flag>0</del_flag>
          <contentattr>0</contentattr>
          <play_length>0</play_length>
          <play_url><![CDATA[]]></play_url>
          <player><![CDATA[]]></player>
          <template_op_type>0</template_op_type>
          <weapp_username><![CDATA[]]></weapp_username>
          <weapp_path><![CDATA[]]></weapp_path>
          <weapp_version>0</weapp_version>
          <weapp_state>0</weapp_state>
          <music_source>0</music_source>
          <pic_num>0</pic_num>
          <show_complaint_button>0</show_complaint_button>
          <vid><![CDATA[]]></vid>
          <recommendation><![CDATA[]]></recommendation>
          <pic_urls/>
          <comment_topic_id>0</comment_topic_id>
          <cover_235_1><![CDATA[]]></cover_235_1>
          <cover_1_1><![CDATA[]]></cover_1_1>
        </item>
      </category>
      <publisher>
        <username/>
        <nickname><![CDATA[校查]]></nickname>
      </publisher>
      <template_header/>
      <template_detail/>
      <forbid_forward>0</forbid_forward>
    </mmreader>
    <thumburl><![CDATA[]]></thumburl>
  </appmsg>
  <fromusername/>
  <appinfo>
    <version>0</version>
    <appname><![CDATA[校查]]></appname>
    <isforceupdate>1</isforceupdate>
  </appinfo>
</msg>

2. 问题在获取des标签内容时只取到了 参考答案:国际环境评估这几个字

  • 分析发现只拿到换行后的字符串
  • 说明这一整段内容是都取到了,但是只保留了最后一次的结果
  • 实际上是我们写的Handler是有问题的。SAX在解析XML时,当遇到一个标签中的内容比较多时,就会多次调用characters。所以我们在写Handler时要考虑到这种情况。就不会丢字符了。
  • 解决办法 在每次调用characters时都将字符放到StringBuffer中。在endElement时,StringBuffer中的内容就是一个标签中的完整字符串
    # 内容事件处理
    def characters(self, content):
    if self.CurrentData == "title":
        self.title = content
    elif self.CurrentData == "des":
        # self.des = content 改进前
        self.des += content

    3. 取值的时候要考虑到各种‘隐藏的符号’就行