Reputation: 6127
I am new to XML parsing. I will get an XML string as shown below
<?xml version="1.0" encoding="UTF-8"?>
<PrintLetterBarcodeData uid="746384773" name="name" gender="F" yob="1994" co="Father's name" house="6-123123" street="street name" vtc="Kakumanu" po="Kakumanu" dist="Goodallor" state="Andhra Pradesh" pc="123456"/>
I need to parse this. From what I saw googling. XML format is different from what I have here which is given below. XML format:
<?xml version="1.0"?>
<records>
<employee>
<name>Sairamkrishna</name>
<surname>Mammahe</surname>
<salary>50000</salary>
</employee>
<employee>
<name>Gopal </name>
<surname>Varma</surname>
<salary>60000</salary>
</employee>
<employee>
<name>Raja</name>
<surname>Hr</surname>
<salary>70000</salary>
</employee>
</records>
And I can't implement usual codes available for parsing an XML String. I don't know what is wrong. Is this normal XML format. Please help. Thanks in advance.
Update: My parsing code is as shown below:
// parsing QR XML
private String getAadharNumber(String xml)
throws XmlPullParserException, ParserConfigurationException, SAXException, IOException {
String value = null;
XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
XmlPullParser myparser = xmlFactoryObject.newPullParser();
InputStream stream = new ByteArrayInputStream(xml.getBytes("UTF-8"));
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(stream);
Element element = doc.getDocumentElement();
element.normalize();
NodeList nodes = element.getElementsByTagName("PrintLetterBarcodeData");
Node node = nodes.item(0);
if (node.getNodeType() == Node.ELEMENT_NODE) {
Element elements = (Element) node;
value = elements.getAttribute("uid");
return value;
}
return null;
}
And I am getting this error:
FATAL EXCEPTION: main Process: in.co.federalbank.mpassbook, PID: 15662
java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=114910, result=-1, data=Intent { act=com.google.zxing.client.android.SCAN flg=0x80000 (has extras) }} to activity {in.co.federalbank.mpassbook/in.co.federalbank.mpassbook.CreateEKYCAccountActivity}: java.lang.NullPointerException: Attempt to invoke interface method 'short org.w3c.dom.Node.getNodeType()' on a null object reference
at android.app.ActivityThread.deliverResults(ActivityThread.java:3779)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3822)
at android.app.ActivityThread.access$1400(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1429)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5497)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'short org.w3c.dom.Node.getNodeType()' on a null object reference
at in.co.fragment.registration.ekyc.GetAadharDetailsFragment.getAadharNumber(GetAadharDetailsFragment.java:137)
at in.co.fragment.registration.ekyc.GetAadharDetailsFragment.onResult(GetAadharDetailsFragment.java:110)
at in.co.fragment.registration.ScannerFragment.onActivityResult(ScannerFragment.java:150)
at android.support.v4.app.FragmentActivity.onActivityResult(FragmentActivity.java:153)
at android.app.Activity.dispatchActivityResult(Activity.java:6490)
at android.app.ActivityThread.deliverResults(ActivityThread.java:3775)
at android.app.ActivityThread.handleSendResult(ActivityThread.java:3822)
at android.app.ActivityThread.access$1400(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1429)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:152)
at android.app.ActivityThread.main(ActivityThread.java:5497)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
Upvotes: 0
Views: 527
Reputation: 6127
Hi thanks everyone for your time. I got the solution. I changed my code as shown below:
private String getAadharNumber(String xml)
throws XmlPullParserException, ParserConfigurationException, SAXException, IOException {
String value = null;
XmlPullParserFactory xmlFactoryObject = XmlPullParserFactory.newInstance();
XmlPullParser myparser = xmlFactoryObject.newPullParser();
InputStream stream = new ByteArrayInputStream(xml.getBytes("UTF-8"));
myparser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
myparser.setInput(stream, null);
myparser.nextTag();
String name = myparser.getName();
if (name.equalsIgnoreCase("PrintLetterBarcodeData")) {
value = myparser.getAttributeValue(null, "uid");
return value;
}
return null;
}
Upvotes: 1
Reputation: 59
Did you look at developer android page ?
https://developer.android.com/training/basics/network-ops/xml.html
Upvotes: 0
Reputation: 507
Parsing xml in android is very easy. You just need to call your API via Asynctask
. I am providing here only function that will parse your xml response.
Just change your code according to your requirement in the given function.
// This function will parse the output (XML) from the webservice.
private void parseXml(XmlPullParser myParser)
{
try {
int event;
String text = null;
event = myParser.getEventType();
while(event != XmlPullParser.END_DOCUMENT)
{
String name = myParser.getName();
switch(event)
{
case XmlPullParser.TEXT:
text = myParser.getText();
break;
case XmlPullParser.END_TAG:
if(name.equalsIgnoreCase("records")){
//if state is not default state
if( !(text.equalsIgnoreCase("37"))) {
emp_record.add(text);
}
}
else if(name.equalsIgnoreCase("employee")){
//if state is not default state
if(!(text.equalsIgnoreCase("Default_State"))) {
emp_info.add(text);
}
}
break;
default:
break;
}// end of switch
event = myParser.next();
}
}
catch (XmlPullParserException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}// end of parseXml
This is just a demo function. Try it yourself.
P.S.:- Before parsing, please do read about XmlPullParser
class. And also I have used ksoap2
library to achieve this.
Thanks. Hope it helps.
Upvotes: 0