Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何解析从OkHttp返回的XML?_Java_Android_Okhttp_Android Xmlpullparser - Fatal编程技术网

Java 如何解析从OkHttp返回的XML?

Java 如何解析从OkHttp返回的XML?,java,android,okhttp,android-xmlpullparser,Java,Android,Okhttp,Android Xmlpullparser,这是我使用OkHttp的异步Get的OkHttp Post表单参数方法 public Call postGetCountries(Callback callback) { RequestBody body = new FormEncodingBuilder() .add("op", "op") .build(); Log.d(TAG_PARAMS, "op=sgetcountrylist, app_type=1"); Request r

这是我使用OkHttp的异步Get的OkHttp Post表单参数方法

public Call postGetCountries(Callback callback) {
    RequestBody body = new FormEncodingBuilder()
        .add("op", "op")
        .build();

    Log.d(TAG_PARAMS, "op=sgetcountrylist, app_type=1");

    Request request = new Request.Builder()
        .url(GATEWAY_URL)
        .post(body)
        .build();

    Call call = CLIENT.newCall(request);
    call.enqueue(callback);

    return call;
}
这是我的自定义回调

private class GetCountriesCallback implements Callback {
    @Override
    public void onFailure(Request request, IOException e) {
        Log.e("OkHttp", e.getMessage());
    }

    @Override
    public void onResponse(Response response) throws IOException {
        Log.d("PASSED", "PASS");
        Log.d(Connection.TAG_RETURN, response.body().string());

        try {
            InputStream is = response.body().byteStream();
            List test = connectionParser.parse(is, "op");

        } catch (XmlPullParserException e) {
            Log.e("PARSE ERROR", e.getMessage());
        }
    }
}
这是我的实例化解析方法

public List parse(InputStream in, String op) throws XmlPullParserException, IOException {
    try {
        XmlPullParser parser = Xml.newPullParser();
        parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
        parser.setInput(in, null);
        parser.nextTag();
        return readFeed(parser, op);
    } finally {
        in.close();
    }
}
我目前正在测试它是否有效不幸的是,我收到了

10-06 11:54:42.492 6336-6892/ D/PASSED: PASS
10-06 11:54:42.692 6336-6892/ E/PARSE ERROR: Invalid stream or encoding: java.io.IOException: closed (position:START_DOCUMENT null@1:1) caused by: java.io.IOException: closed
这是我在活动的onCreate上用于启动整个流程的内容:

private Connection connect = Connection.getInstance();
connect.postGetCountries(new GetCountriesCallback());

我不明白为什么InputStream会关闭。

可能发生了两件事。首先,你只能读一次正文。如果你想多次阅读,你需要把结果存储在某个地方。你在读尸体两遍,一次在这里--

然后在这里--

当您开始解析时,您已经耗尽了流中的可用输入。快速解决方案是删除log语句


另一件可能会绊倒您或将来可能绊倒您的事情是
onResponse
,即使在HTTP返回错误代码的情况下也会调用它。您应该检查
响应
或方法,以确定是否应该尝试解析响应。

这将返回带有as的xml以及如何解决此问题?
Log.d(Connection.TAG_RETURN, response.body().string());
InputStream is = response.body().byteStream();
List test = connectionParser.parse(is, "op");