Nabeel K
Nabeel K

Reputation: 6127

Cant Parse XML in android

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

Answers (3)

Nabeel K
Nabeel K

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

Eren C
Eren C

Reputation: 59

Did you look at developer android page ?
https://developer.android.com/training/basics/network-ops/xml.html

Upvotes: 0

Swanand
Swanand

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

Related Questions