#java #android
#java #Android
Вопрос:
Я пытаюсь извлечь некоторый XML и в конечном итоге использовать его как строку. Вот мои два метода, первый из которых вызывает последний.
public static void getAllXML(String url) throws XmlPullParserException, IOException, URISyntaxException{
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
parser.setInput(new InputStreamReader(getUrlData(url)));
XmlUtils.beginDocument(parser,"results");
int eventType = parser.getEventType();
do{
XmlUtils.nextElement(parser);
parser.next();
eventType = parser.getEventType();
if(eventType == XmlPullParser.TEXT){
Log.d("test",parser.getText());
}
} while (eventType != XmlPullParser.END_DOCUMENT) ;
}
public static InputStream getUrlData(String url) throws URISyntaxException, ClientProtocolException, IOException {
DefaultHttpClient client = new DefaultHttpClient();
HttpGet method = new HttpGet(new URI(url));
HttpResponse res = client.execute(method);
return res.getEntity().getContent();
}
Затем я использую метод, который принимает InputStream
и преобразует его в String
. Но как мне ухватиться за InputStream
возвращенный getUrlData
методом, чтобы я мог вызвать convertStreamToString(myInputStream)
?
Комментарии:
1. Предполагая, что опубликованный вами код компилируется и работает нормально, можете ли вы просто сделать это: InputStream myInputStream = getUrlData(url); convertStreamToString(myInputStream); ?
Ответ №1:
Вы можете использовать TeeInputStream
( http://commons.apache.org/io/api-1.4/org/apache/commons/io/input/TeeInputStream.html ) чтобы получить входной поток, который вы передаете анализатору, а также записать входные данные в ByteArrayInputStream, с которым вы можете затем использовать ByteArrayOutputStream.toString(String encoding)
.
Что-то вроде
ByteArrayOutputStream bytes = new ByteArrayOutputStream();
TeeInputStream is = new TeeInputStream(getDataUrl(...), bytes);
try {
// Pass is to parser here.
parser.setInput(new InputStreamReader(is, "UTF-8"));
// Note: please specify an encoding with InputStreamReader, maybe based on
// the headers from getDataUrl.
...
} finally {
is.close();
}
// After parsing finishes, convert the bytes to a String.
String parsed = bytes.toString("UTF-8");
// If UTF-8 is not appropriate, use the encoding specified in headers from URL.
В качестве альтернативы, вы можете сначала прочитать строку в, а затем использовать StringReader
with parser.setInput
. Если ваш анализатор настроен на отклонение больших входных данных или может принимать InputStream
в качестве входных данных и выполняет определение кодировки, которую вы, возможно, захотите использовать позже, то описанный выше подход является более гибким.
Ответ №2:
Просто прочитайте поток с java.io API?
Что-то вроде :
package essai;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Reader {
public static String convertStreamToString (InputStream stream) throws IOException {
String result = "";
//Wrap the input stream into a buffered reader so reading is faster and more important, easier with the use of readLine method.
InputStreamReader reader = new InputStreamReader(stream);
BufferedReader bufferedReader = new BufferedReader(reader);
String currentLine = bufferedReader.readLine();
while (currentLine !=null) {
result =currentLine;
currentLine = bufferedReader.readLine();
}
return resu<
}
}
Конечно, вы могли бы оптимизировать, и распространенной ошибкой, в частности, было бы, если ваш XML огромен без возврата каретки, но это должно помочь вам начать.