2016-12-21 3 views
0

Я новичок в разборе XML. Я получу XML-строку, как показано ниже.Cant Parse XML в android

<?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"/> 

Мне нужно разобрать это. Из того, что я видел, в Google. Формат XML отличается от того, что у меня есть здесь, которое приведено ниже. формат XML:

<?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> 

И я не могу реализовать обычные коды, доступные для разбора XML-строки. Я не знаю, что не так. Это обычный формат XML. Пожалуйста помоги. Заранее спасибо.

Update: Мой синтаксический код, как показано ниже:

// 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; 
    } 

И я получаю эту ошибку :

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)  
+0

Вы можете поделиться кодом парсинга .... XML является действительным ... –

+1

Оба фрагмента кода вы вывешенным действительна XML. У ваших есть данные, хранящиеся как атрибуты, а другие - данные, хранящиеся во вложенных тегах. Было бы более полезно, если бы вы разместили фрагмент кода анализа, и мы могли бы помочь вам определить, что не так. – Karakuri

+1

@Nabeel K проверить эту ссылку он может вам помочь: http://stackoverflow.com/questions/12119356/how-to-get-value-of-node-list-in-xml-dom-parser – Piyush

ответ

0

Синтаксический XML в Android очень легко. Вам просто нужно позвонить по вашему API через Asynctask. Я предоставляю здесь только функцию, которая будет анализировать ваш XML-ответ. Просто измените свой код в соответствии с вашим требованием в данной функции.

// 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 

Это просто демонстрационная функция. Попробуй сам.

P.S.:- Перед разбором прочитайте, пожалуйста, примерно XmlPullParser класс. А также я использовал библиотеку ksoap2 для достижения этой цели.

Спасибо. Надеюсь, поможет.

1

Привет, спасибо всем за ваше время. Я получил решение. Я изменил код, как показано ниже:

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; 
    }