Reputation: 5428
I have this xml:
<xml><result>-1</result></xml>
and following java code:
public String findElement(String xml, String elem) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput( new StringReader (xml) );
while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
if (xpp.getName().equals(elem)) {
return xpp.getText();
}
xpp.next();
}
} catch (XmlPullParserException | IOException e) {
e.printStackTrace();
}
return null;
}
But xpp.getName()
returns null instead of "result"
. As result NullPointerException
is throwed.
Where am I wrong?
Upvotes: 1
Views: 2254
Reputation: 4864
Of course you need to check some more conditions like what if there is no text or tag consist another nested tag...
public String findElement(String xml, String elem) {
try {
XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser xpp = factory.newPullParser();
xpp.setInput(new StringReader(xml));
while (xpp.getEventType() != XmlPullParser.END_DOCUMENT) {
final int event = xpp.getEventType();
if (event == XmlPullParser.START_TAG && xpp.getName().equals(elem)) {
xpp.next();
return xpp.getText();
}
xpp.next();
}
} catch (XmlPullParserException | IOException e) {
e.printStackTrace();
}
return null;
}
and this
if (event == XmlPullParser.START_TAG && xpp.getName().equals(elem)) {
xpp.next();
if (xpp.getEventType() == XmlPullParser.TEXT) {
return xpp.getText();
}
}else{
xpp.next();
}
would work for something nested like
"<xml><result><noway><result>-1</result></noway></result></xml>"
Upvotes: 1
Reputation:
Change your code like this.
int eventType = xpp.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT) {
if (eventType == XmlPullParser.START_TAG) {
if (xpp.getName().equals(elem)) {
eventType = xpp.next(); // advance to inner text
return xpp.getText();
}
}
eventType = xpp.next();
}
Upvotes: 1