java - Evaluating XPath an XmlResourceParser causes Exception -
i have , xml-file in resources looks (removed other stage-elemets):
<?xml version="1.0" encoding="utf-8"?> <schedule name="irgend ein besondere zuchtname"> <stages> <stage interval="0" token="3"> <name>name</name> <descrition>some description...</descrition> <image>image_to_retrieve.jpg</image> </stage> </stages> </schedule> i want text of image-element specific stage (by token). approach this:
public string getimage(int stagetoken) { // because helper class, context set in constructor xmlresourceparser parser = context.getresources().getxml(r.xml.schedule_default); xpath xpath = xpathfactory.newinstance().newxpath(); string image; try { // error occurs here: image = xpath.evaluate("//stage[@token=3]/image/text()", parser); } catch (xpathexpressionexception e) { log.e(log_tag, "error evaluating xpath expression."); e.printstacktrace(); return null; } parser.close(); return image; } the expression shouldn't problem, because tested other xpath-programms. same validity of xml. exception get:
01-17 00:12:05.044 30417-30417/at.beekeeper w/system.err: javax.xml.xpath.xpathexpressionexception: javax.xml.transform.transformerexception: attempt invoke interface method 'org.apache.xml.dtm.dtmaxistraverser org.apache.xml.dtm.dtm.getaxistraverser(int)' on null object reference 01-17 00:12:05.045 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.jaxp.xpathimpl.evaluate(xpathimpl.java:295) 01-17 00:12:05.045 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.jaxp.xpathimpl.evaluate(xpathimpl.java:371) 01-17 00:12:05.045 30417-30417/at.beekeeper w/system.err: @ at.beekeeper.util.scheduleparser.getimage(scheduleparser.java:108) 01-17 00:12:05.045 30417-30417/at.beekeeper w/system.err: @ at.beekeeper.view.stageactivity.oncreate(stageactivity.java:52) 01-17 00:12:05.045 30417-30417/at.beekeeper w/system.err: @ android.app.activity.performcreate(activity.java:5953) 01-17 00:12:05.045 30417-30417/at.beekeeper w/system.err: @ android.app.instrumentation.callactivityoncreate(instrumentation.java:1128) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ android.app.activitythread.performlaunchactivity(activitythread.java:2267) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ android.app.activitythread.handlelaunchactivity(activitythread.java:2388) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ android.app.activitythread.access$800(activitythread.java:148) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ android.app.activitythread$h.handlemessage(activitythread.java:1292) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ android.os.handler.dispatchmessage(handler.java:102) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ android.os.looper.loop(looper.java:135) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ android.app.activitythread.main(activitythread.java:5312) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ java.lang.reflect.method.invoke(native method) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ java.lang.reflect.method.invoke(method.java:372) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:901) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ com.android.internal.os.zygoteinit.main(zygoteinit.java:696) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: caused by: javax.xml.transform.transformerexception: attempt invoke interface method 'org.apache.xml.dtm.dtmaxistraverser org.apache.xml.dtm.dtm.getaxistraverser(int)' on null object reference 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.xpath.execute(xpath.java:365) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.jaxp.xpathimpl.eval(xpathimpl.java:219) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.jaxp.xpathimpl.evaluate(xpathimpl.java:281) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: ... 16 more 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: caused by: java.lang.nullpointerexception: attempt invoke interface method 'org.apache.xml.dtm.dtmaxistraverser org.apache.xml.dtm.dtm.getaxistraverser(int)' on null object reference 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.axes.axeswalker.setroot(axeswalker.java:221) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.axes.walkingiterator.setroot(walkingiterator.java:157) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.axes.nodesequence.setroot(nodesequence.java:265) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.axes.locpathiterator.execute(locpathiterator.java:212) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: @ org.apache.xpath.xpath.execute(xpath.java:337) 01-17 00:12:05.046 30417-30417/at.beekeeper w/system.err: ... 18 more
i found solution use xpath. need use inputsource , put xml-file /raw directory.
inputsource inputsource = new inputsource(context.getresources().openrawresource(r.raw.schedule_default)); xpath xpath = xpathfactory.newinstance().newxpath(); string image; try { image = xpath.evaluate("//stage[@token=3]/image/text()", inputsource); } catch (xpathexpressionexception e) { log.e(log_tag, "error evaluating xpath expression."); e.printstacktrace(); return null; } but i'm still not sure if possible use xmlpullparser xpath...
Comments
Post a Comment