2013-07-31 23 views

回答

7
StringRequest req = new StringRequest(Request.Method.GET, url, 
    new Response.Listener<String>() 
    { 
     @Override 
     public void onResponse(String response) { 
      processData(response); 
     } 
    }, 
    new Response.ErrorListener() 
    { 
     @Override 
     public void onErrorResponse(VolleyError error) {         
     // handle error response 
     } 
    } 
); 

in processdata method解析响应。使用简单的sax解析器或dom解析器来解析响应字符串。

+0

@IftikarUrrhmanKhan我从来没有注意到它,谢谢我已经更新了相同的答案。 – Piyush

+0

我将如何以xml格式请求带有用户名和密码的POST方法。 – Satheesh

+0

只是一个细节,你有processData(响应)的错字; – estebanuri

12

看着排球的来源:

https://android.googlesource.com/platform/frameworks/volley/+/android-4.3_r0.9/src/com/android/volley/toolbox/

如果我没有记错的话,它带有JsonObjectRequestStringRequest,但没有XMLRequest。

因此,您可以使用StringRequest获得作为String的响应,然后使用任何XML编组/序列化工具(例如:Simple)将其转换为Object。

退房Simple - XML编组工具: http://simple.sourceforge.net/download.php

如果使用StringRequest,类似下面应该这样做:

StringRequest request = new StringRequest(Request.Method.GET, url, 
    new Response.Listener<String>() 
    { 
     @Override 
     public void onResponse(String response) { 
      // convert the String response to XML 
      // if you use Simple, something like following should do it 
      Serializer serializer = new Persister(); 
      serializer.read(ObjectType.class, response); 
     } 
    }, 
    new Response.ErrorListener() 
    { 
     @Override 
     public void onErrorResponse(VolleyError error) {         
     // handle error response 
     } 
    } 
); 
queue.add(request); 

或者,您可以通过申请延长创建自己的XMLRequest类,并使用XML序列化工具(如简单)来返回对象。

希望它有帮助,

+9

最近,我不得不创建一个SimpleXMLRequest类来解析XML响应使用凌空对象。以下是任何人都需要的代码片段:https://gist.github。com/itsalif/6149365 – Alif

+0

谢谢你的回答。 – userAndroid

+0

那么,为了解析数据,我们必须使用我们自己的解析逻辑? – userAndroid

2

这是我的解决方案。正如Sir Alif上面所说,volley可以为您提供从服务器接收到的原始XML数据字符串。所以,你需要做的就是分析这个字符串符合你的应用逻辑。所以,为了解析字符串,我使用了SAX解析器。我不打算在这里描述如何使用SAX解析器,因为你可以自己找到大量的教程,我只是描述关键点。下面的代码显示了当你创建SAXParserFactory,SAXParser,XMLReader等实例的时候,在这里你也创建了一个InputSource的实例,这是关键。通常情况下,您使用特定的URL地址打开连接,然后SAX解析器为您解析收到的数据。但是,就我们试图使用Volley库而言,我们将给InputSource不是InputStream,而是一个StringReader(有关输入源及其公共构造函数的完整信息,您可以找到here)。它看起来是这样的:

public void makeList(String s){ 
    SAXParserFactory factory = SAXParserFactory.newInstance(); 
    SAXParser sp = factory.newSAXParser(); 
    XMLReader xmlReader = sp.getXMLReader(); 
    SaxHandler handler = new SaxHandler(); 
    xmlReader.setContentHandler(handler);        
    InputSource is = new InputSource(new StringReader(s)); 
    is.setEncoding("UTF-8"); 
    xmlReader.parse(is); 
} 

所以,在活动中,你在哪里得到的StringRequest从截击,在onRespone()方法,你可以传递给makeList(String s)将方法响应(或者任何你称为具有相同功能的方法),它将解析你的响应。希望这可以帮助!如果您有问题,请在评论中提问。

0

首先,你必须获得通过响应字符串:

StringRequest req = new StringRequest(Request.Method.GET, url, 
new Response.Listener<String>() 
{ 
    @Override 
    public void onResponse(String response) { 
     InputStream is = convertStringToDocument(reponse); 
     // now you can parse xml 
    } 
}, 
new Response.ErrorListener() 
{ 
    @Override 
    public void onErrorResponse(VolleyError error) {         
    // handle error response 
    } 
} 

);

通过抽射输入反应得到后你用这种方法来输入流串转换响应:

private static InputStream convertStringToDocument(String xmlStr) { 
    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder builder; 
    try 
    { 
     builder = factory.newDocumentBuilder(); 
     Document doc = builder.parse(new InputSource(new StringReader(xmlStr))); 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     Source xmlSource = new DOMSource(doc); 
     Result outputTarget = new StreamResult(outputStream); 
     TransformerFactory.newInstance().newTransformer().transform(xmlSource, outputTarget); 
     InputStream is = new ByteArrayInputStream(outputStream.toByteArray()); 
     return is; 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return null; 
}