【问题标题】:XML Parsing and HashMap storing: message is cut after apostropheXML 解析和 HashMap 存储:消息在撇号后被剪切
【发布时间】:2011-07-04 14:07:42
【问题描述】:

当我解析以下 XML 并将其存储在 HashMap 中时,消息在 (') 这个符号之后被剪切。

例如。消息:“嘿 amar!怎么了?”。剪成这样。

  • 消息 =(3577):嘿,阿马尔!什么
  • 消息=(3577):'
  • 消息 =(3577): 起来了吗?

最后的输出是:message = "s up?"

那么如何解决这个问题呢?

支持 XML 数据的 HashMap:

public static HashMap<String,String> message_map1 = new HashMap<String,String>();
public static HashMap<String,String> message_map2 = new HashMap<String,String>();
public static HashMap<String,String> message_map3 = new HashMap<String,String>();

XML:

<statuses type="array">
 <status>
  <messageinfo>
    <messageid>485</messageid>
    <userid>58</userid>
    **<message>Hey amar! What's up?</message>**
  </messageinfo>
 <messageinfo>
    <messageid>486</messageid>
    <userid>58</userid>
    **<message>Hey What's up?</message>**
  </messageinfo>
 <messageinfo>
    <messageid>485</messageid>
    <userid>58</userid>
    **<message>What's up?</message>**
  </messageinfo>
 </status>
</statuses>

代码:

package com.xmldataparser;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;

public class Message_XHandler extends DefaultHandler 
{
     boolean in_porf_msg_statuses;
     boolean in_prof_msg_status;
     boolean in_prof_msg_messageinfo;
     boolean in_prof_msg_messageid;
     boolean in_prof_msg_userid;
     boolean in_prof_msg_message;

    int i=0;
    public String key = "";
    public String value = "";

    XMLData xml_message;

    @Override
    public void startDocument() throws SAXException
    {
        super.startDocument();
        xml_message = new XMLData();
    }

    @Override
    public void startElement(String uri, String localName, String qName,
        Attributes attributes) throws SAXException 
    {
        super.startElement(uri, localName, qName, attributes);

        if(localName.equalsIgnoreCase("statuses"))
        {
            in_porf_msg_statuses= true;
        }
        else if(localName.equalsIgnoreCase("status"))
        {
            in_prof_msg_status = true;
        }
        else if(localName.equalsIgnoreCase("messageinfo"))
        {
            in_prof_msg_messageinfo = true;
            i++;
        }
        else if(localName.equalsIgnoreCase("messageid"))
        {
            in_prof_msg_messageid = true;
        }
        else if(localName.equalsIgnoreCase("userid"))
        {
            in_prof_msg_userid = true;
        }
        else if(localName.equalsIgnoreCase("message"))
        {
            in_prof_msg_message = true;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException 
    {
        super.characters(ch, start, length);
        String chars = new String(ch,start,length);
        chars = chars.trim();

        else if(in_prof_msg_messageid)
        {   
            if(i==1)
                {
                    xml_message.message_map1.put("messageid", chars);
                }
            else if(i==2)
                 {
                xml_message.message_map2.put("messageid", chars);
                 }
            else if(i==3)
             {
                xml_message.message_map3.put("messageid", chars);
             }  
            Log.v("messageid = ", chars);
        } 
        else if(in_prof_msg_userid)
        {   
            if(i==1)
                {
                    xml_message.message_map1.put("userid", chars);
                }
            else if(i==2)
                 {
                xml_message.message_map2.put("userid", chars);
                 }
            else if(i==3)
             {
                xml_message.message_map3.put("userid", chars);
             }  

                Log.v("userid = ", chars);
        } 
        else if(in_prof_msg_message)
        {   
            if(i==1)
                {
                xml_message.message_map1.put("message", chars);
                }
            else if(i==2)
                 {
                    xml_message.message_map2.put("message", chars);
                 }
            else if(i==3)
                 {
                    xml_message.message_map3.put("message", chars);
                 }  

                Log.v("message = ", chars);

        } 


        } 


    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException 
    {
        super.endElement(uri, localName, qName);

        if(localName.equalsIgnoreCase("statuses"))
        {
            in_porf_msg_statuses = false;
        }

        else if(localName.equalsIgnoreCase("messageinfo"))
        {
            in_prof_msg_messageinfo = false;
        }
        else if(localName.equalsIgnoreCase("messageid"))
        {
            in_prof_msg_messageid = false;
        }
        else if(localName.equalsIgnoreCase("userid"))
        {
            in_prof_msg_userid= false;
        }
        else if(localName.equalsIgnoreCase("message"))
        {
            in_prof_msg_message = false;
        }
    }

    @Override
    public void endDocument() throws SAXException
    {
        super.endDocument();
    }

    public XMLData getProfileMessageData()
    {
        Log.v("WHERE","Message_XHandler getProfileMessageData()");
        return xml_message;
    }
}

问题: 日志: 07-04 13:38:37.924:详细/消息 =(3577):嘿,阿马尔!什么 07-04 13:38:37.934:详细/消息=(3577):' 07-04 13:38:37.934: 详细/消息 =(3577): 起来了吗?

【问题讨论】:

    标签: android hashmap xml-parsing saxparser


    【解决方案1】:

    解析器可以多次调用characters 方法,每次调用时只提供给定标记内的部分字符。

    此代码不允许这种情况发生。

    您要做的是在startElement 方法中设置一个字符串缓冲区,在characters 中将字符收集到其中并在endElement 方法中提取字符串结果。

    【讨论】:

    • 你好唐罗比,感谢您的帮助。我是 Android 的初学者。如果您有代码,请发布。
    【解决方案2】:

    正如唐·罗比回答的那样......

    获取一个字符串变量并在您的 in_message 变量变为 false 的 endElement() 方法中添加您的地图。
    例如这样做...

    String str = "";
    

    //在characters()方法中 否则如果(in_message) { str += 字符; } //在endElement()方法中

    else if(localName.equalsIgnoreCase("message")) { in_message = 假; map.put("消息", str); Log.i("map "+i," message = "+str); str = ""; } `

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多