Я пытаюсь понять синтаксический анализ XML с помощью результатов API Wolfram | Alpha, я искал общие вопросы о XmlPullParser в Android, но, похоже, не смог проанализировать данные XML.
try {
URL url = new URL(urlString);
URLConnection urlConnection = url.openConnection();
InputStream response = urlConnection.getInputStream();
XmlPullParser parser = Xml.newPullParser()
parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
parser.setInput(response, null);
parser.nextTag();
results = readFeed(parser);
} catch (Exception e) {
e.printStackTrace();
}
Я могу нормально подключиться к API и получить результат. http://products.wolframalpha.com/api/explorer.html Вы сможете чтобы увидеть, какие результаты вы получите обратно.
Мой основной запрос выглядит следующим образом: http://api.wolframalpha.com/v2/query?appid=xxx&input=What%20day%20is%20today%3F&format=plaintext
Теперь для разбора inputStream:
private List<String> readFeed(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, null, "queryresult");
List<String> entries = new ArrayList<>();
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
// Starts by looking for the entry tag
if (name.equals("pod")) {
System.out.print(" In pod: " + parser.getName());
entries.add(readEntry(parser));
}
else{
skip(parser);
}
}
return entries;
}
private String readEntry(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, null, "pod");
String plainText = null;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("subpod")) {
System.out.print(" In subpod: " + parser.getName());
plainText = getPlainText(parser);
}
else{
skip(parser);
}
}
return plainText;
}
private String getPlainText(XmlPullParser parser) throws XmlPullParserException, IOException {
parser.require(XmlPullParser.START_TAG, null, "subpod");
String result = null;
while (parser.next() != XmlPullParser.END_TAG) {
if (parser.getEventType() != XmlPullParser.START_TAG) {
continue;
}
String name = parser.getName();
if (name.equals("plaintext")) {
System.out.print(" In plaintext: " + parser.getText());
result = parser.getText();
}
else{
skip(parser);
}
}
return result;
}
Результаты на моей консоли выглядят так:
I/System.out﹕ In pod: pod In subpod: subpod In plaintext: null[null]
Код работает нормально, но есть некоторые проблемы:
- Он не может найти значение для тега открытого текста.
- Кажется, это только цикл через первый тег pod.