Android的Volley库解析xml响应?

时间:2013-07-31 06:12:51

标签: android-volley

我正在使用volley库并在XML中获取响应。我想知道如何使用/ volley库解析响应。谢谢。

4 个答案:

答案 0 :(得分:12)

看着Volley的来源:

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

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

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

查看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);

或者,您可以通过从Request扩展来创建自己的XMLRequest类,并使用XML Serialization工具(如Simple)返回Object。

希望它有所帮助,

答案 1 :(得分:10)

    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
       }
    }
);
processdata方法中的

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

答案 2 :(得分:2)

这是我的解决方案。正如Alif爵士所说,凌空可以为您提供从服务器接收的原始XML数据串。因此,您需要做的就是根据您的应用程序逻辑解析此String。因此,为了解析String,我使用了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); 
}

因此,在Activity中,从Volley获取StringRequest,在onRespone()方法中,您可以将该响应传递给makeList(String s)方法(或者您调用具有相同功能的方法),会解析你的回应。希望这可以帮助!如果您有任何疑问,请在评论中提问。

答案 3 :(得分: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
   }
}

);

通过volley获得respone后,你必须通过这种方法将String响应转换为输入流:

 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;
}