XMLPullParser getName() возвращает ноль
Я пытаюсь разобрать openweathermap api http://api.openweathermap.org/data/2.5/weather?q=London&mode=xml
, Я использую KXmlParser через XmlPullParserFactory.newPullParser(), но XMLPullParser.getName() всегда возвращает нуль. Возможно, это какая-то глупая ошибка, но, похоже, мне нужна твоя помощь, чтобы увидеть это.
Вот код для чтения API через HTTPURLConnection
,
URL url = new URL(urlString);
URLConnection urlConnection = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection) urlConnection;
httpConnection.setRequestMethod("GET");
httpConnection.connect();
if(httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK){
inputStream = httpConnection.getInputStream();
}
я использовал
BufferedReader buffer = new BufferedReader(
new InputStreamReader(inputStream));
String s="";
while ((s=buffer.readLine())!=null){
stringBuffer.append(s);
System.out.println(s);
}
чтобы убедиться, что я успешно прочитал xml, и оказалось, что код работает правильно. Далее я использую следующий код для разбора XML
XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
XmlPullParser myparser = xmlFactoryObject.newPullParser();
myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES
, false);
myparser.setInput(inputStream, null);
int event = myparser.getEventType();
while (event != XmlPullParser.END_DOCUMENT){
Log.d("XMLPullParserHandler", "sdfdsf " + myparser.getName());
String name = myparser.getName();
Но я получаю исключение java.lang.NullPointerException в myparser.getName(); также приведенный выше журнал показывает "sdfdsf null".
Что я делаю неправильно?
2 ответа
Вы можете проанализировать данный xml или изменить режим на json и разобрать json
Ваш тег XML выглядит
<city id="2643743" name="London">
// tag name is city
// id and name are attributes with values 2643743 and London
Примечание: я показал только разбор нескольких тегов. Но это должно помочь вам разобраться и сделать анализ самостоятельно.
Из документации
public abstract String getName () Добавлен на уровне API 1
Для событий START_TAG или END_TAG (локальное) имя текущего элемента возвращается, когда пространства имен включены. Когда обработка пространства имен отключена, возвращается необработанное имя. Для событий ENTITY_REF возвращается имя объекта. Если текущее событие не START_TAG, END_TAG или ENTITY_REF, возвращается значение null.
Разобрать xml и получить значения
public class XMLPullParserHandler {
public XMLPullParserHandler() {
}
public Void parse(InputStream is) {
XmlPullParserFactory factory = null;
XmlPullParser parser = null;
try {
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
parser = factory.newPullParser();
parser.setInput(is, null);
boolean check =false;
//factory instantiates an object
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
switch (eventType) {
case XmlPullParser.START_TAG:
String tagname = parser.getName();
Log.i("Tag names are ",tagname);
if (tagname.equalsIgnoreCase("city")) {
if(parser.getAttributeValue(null, "id").equals("264374"))
{
String cityname= parser.getAttributeValue(null, "name");
Log.i(" City Name is ",cityname);
}
}
if (tagname.equalsIgnoreCase("coord")) {
String lat= parser.getAttributeValue(null, "lat");
String lon= parser.getAttributeValue(null, "lon");
Log.i("Latitude and Longitude is","Lat= "+lat+"Lon= "+lon);
}
if (tagname.equalsIgnoreCase("sun")) {
String rise= parser.getAttributeValue(null, "rise");
String set= parser.getAttributeValue(null, "set");
Log.i("Sun Rise and Sun set is","Rise= "+rise+"Set= "+set);
}
break;
case XmlPullParser.TEXT:
break;
case XmlPullParser.END_TAG:
break;
default:
break;
}
eventType = parser.next();
}
} catch (XmlPullParserException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
Журнал
08-18 16:14:35.885: I/City Name is(31634): London
08-18 16:14:35.885: I/Latitude and Longitude is(31634): Lat= 51.51Lon= -0.13
08-18 16:14:35.885: I/Sun Rise and Sun set is(31634): Rise= 2014-08-18T04:51:39Set= 2014-08-18T19:16:53
Также, если ваш тег XML выглядит ниже
<cityname type="test">City is London</cityname>
Чтобы получить значение
case XmlPullParser.TEXT:
text = parser.getText();
break;
case XmlPullParser.END_TAG:
if (tagname.equalsIgnoreCase("cityname")) {
Log.i("Name is",text);
}
break;
Редактировать:
AsyncTask
class TheTask extends AsyncTask<Void,Void,Void>
{
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
String response;
try {
DefaultHttpClient httpClient = new DefaultHttpClient();
HttpGet httpGet = new HttpGet("http://api.openweathermap.org/data/2.5/weather?q=London&mode=xml");
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
response = EntityUtils.toString(httpEntity);
InputStream is = new ByteArrayInputStream(response.getBytes(Charset.forName("UTF-8")));
new XMLPullParserHandler().parse(is);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
START_DOCUMENT
первое событие, которое вы всегда получаете от парсера, в то время как getName()
возвращает не ноль только в случае START_TAG
, END_TAG
а также ENTITY_REF
События.
Для событий START_TAG или END_TAG (локальное) имя текущего элемента возвращается, когда пространства имен включены. Когда обработка пространства имен отключена, возвращается необработанное имя. Для событий ENTITY_REF возвращается имя объекта. Если текущее событие не START_TAG, END_TAG или ENTITY_REF, возвращается значение null.
Попробуй это:
while (event != XmlPullParser.END_DOCUMENT) {
if (event == XmlPullParser.START_TAG || event == XmlPullParser.END_TAG) {
Log.d("XMLPullParserHandler", "sdfdsf " + myparser.getName());
String name = myparser.getName();
}
event = myparser.next();
}