我正在使用volley库并在XML中获取响应。我想知道如何使用/ volley库解析响应。谢谢。
答案 0 :(得分:12)
看着Volley的来源:
如果我没有记错,它会带有JsonObjectRequest
和StringRequest
,但没有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;
}