使用Android中的Ksoap2库管理Web Service返回的不同结构

时间:2012-09-04 08:33:06

标签: android web-services parsing xml-parsing ksoap2

我正在使用KSoap2库,我的网络服务有两种可能性:

1)返回类似这样的内容

  -<Services> 
       -<Service> 
           <id>12</id> 
           <function_code>2</function_code>  
           <cf>AABBBCCCAAA</cf> 
           <active>0</active> <last_change_date>2012-07-12T16:00:34</last_change_date> 
        </Service> 
        -<Service> 
           <id>10</id> 
           <function_code>3</function_code>  
           <cf>ZZZZZYYYYYYKKKK</cf> 
           <active>0</active> <last_change_date>2012-08-08T16:00:34</last_change_date> 
        </Service> 
    </Services>

这是一个Service对象数组。

2)或者返回:

    <Msg>error: user not found</Msg>

如果服务器端出错。

显然我不知道Web服务的答案是什么;我已经实现了两种不同的解析方法。如何确定必须使用哪种解析方法?如果我在收到错误消息时创建一个等待第一个结构的解析方法,我无法正确解析。 如果收到的消息有第一个或第二个结构,我可以评估先验吗?

p.s。:我不想使用KvmSerializable类。

1 个答案:

答案 0 :(得分:0)

如何在View XML中获取XML字符串

public void viewXML(String xmlStr) throws IOException{
        try{
            byte[] xmlByteArray=xmlStr.getBytes();
            ByteArrayInputStream xmlStream=new ByteArrayInputStream(xmlByteArray);
            InputStreamReader xmlReader=new InputStreamReader(xmlStream);
            XmlParser parser=new XmlParser(xmlReader);
            try{
                traverse(parser,"");
            }
            catch(Exception exc){
                exc.printStackTrace();
            }
            return;
        }
        catch(IOException e){
            return;
        }
    }

和Traverese它喜欢

public void traverse(XmlParser parser,String indent) throws Exception{
        boolean leave=false;
        String sValue="";
        do{
            ParseEvent event=parser.read();
            ParseEvent pe;
            switch(event.getType()){
                case Xml.START_TAG:
                    if("id".equals(event.getName())){
                        pe=parser.read();
                        sValue=pe.getText()+"~~";
                    }
                    if("function_code".equals(event.getName())){
                        pe=parser.read();
                        sValue=sValue+pe.getText()+"~~";
                    }
                    if("cf".equals(event.getName())){
                        pe=parser.read();
                        sValue=sValue+pe.getText()+"~~";
                    }
                    if("active".equals(event.getName())){
                        pe=parser.read();
                        sValue=sValue+pe.getText()+"~~";
                    }
                    traverse(parser,"");
                    break;
                case Xml.END_TAG:
                    leave=true;
                    break;
                case Xml.END_DOCUMENT:
                    leave=true;
                    break;
                case Xml.TEXT:
                    break;
                case Xml.WHITESPACE:
                    break;
                default:
            }
        }while(!leave);
    }
Check This Out