1

I'm trying to parse an xml file. But method getAttributeValue always returns null for me. First of all here's the xml file

<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

And here's my code. I'm using AsyncTask

 public class XmlParser extends AsyncTask<Void, Void, String> {

        private XmlPullParserFactory xmlFactoryObject;
        private XmlPullParser myParser;
        private File file;
        FileInputStream fis;

        String value;

        public XmlParser() {
            try {
                xmlFactoryObject = XmlPullParserFactory.newInstance();
                myParser = xmlFactoryObject.newPullParser();

            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
        }

        public void setFile(File file1) {
            file = file1;
            execute();
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();

            try {
                if(file == null){
                    Toast.makeText(getActivity(), "NULL", Toast.LENGTH_LONG).show();
                }else{
                    Toast.makeText(getActivity(), "NOT NULL " + file.getName(), Toast.LENGTH_LONG).show();
                    fis = new FileInputStream(file);
                    myParser.setInput(fis, null);
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
        }

        @Override
        protected String doInBackground(Void... params) {
            int event = 0;
            try {
                event = myParser.getEventType();
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            }
            while (event != XmlPullParser.END_DOCUMENT) {
                String name=myParser.getName();
                switch (event){
                    case XmlPullParser.START_TAG:
                        break;

                    case XmlPullParser.END_TAG:
                        if(name.equals("from")){
                            value = myParser.getAttributeValue(null, "value"); // this line always return null
                            Log.d(getTag(), "NEZINAU " + value);
                        }
                        break;
                }
                try {
                    event = myParser.next();
                } catch (XmlPullParserException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    Log.d(getTag(), "BAD " + e.getLocalizedMessage());
                }
            }
            return value;
        }

        @Override
        protected void onPostExecute(String aVoid) {
            super.onPostExecute(aVoid);
            System.out.println("myEND " + aVoid);
            Toast.makeText(getActivity(), "THE END!!! " + value, Toast.LENGTH_LONG).show();
            try {
                fis.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

this line value = myParser.getAttributeValue(null, "value"); // this line always return null always returns null. Why?

hata
  • 11,633
  • 6
  • 46
  • 69
David
  • 3,055
  • 4
  • 30
  • 73

2 Answers2

3

An attribute in XML looks like this:

<Tag attribute="value">content</Tag>

The tags in your XML document do not have attributes. You want to use xmlPullParser.getText() to get the text content between the opening and closing tag.

Karakuri
  • 38,365
  • 12
  • 84
  • 104
1

You must retrieve value with XmlPullParser.getText() on event XmlPullParser.TEXT. See example here: http://developer.android.com/reference/org/xmlpull/v1/XmlPullParser.html

Try something like this:

    String currentName = "";
    while (event != XmlPullParser.END_DOCUMENT) {
        String name=myParser.getName();
        switch (event){
            case XmlPullParser.START_TAG:
                currentName = name;
                break;
            case XmlPullParser.TEXT:
                if("from".equals(currentName)){
                    value = myParser.getText(); 

                    Log.d(getTag(), "NEZINAU " + value);                        
                    }

                break;


            case XmlPullParser.END_TAG:
                break;
        }
Fox
  • 417
  • 4
  • 13
  • Thanks, but my program crash after this. – David Jul 31 '15 at 14:15
  • What line program crashed? – Fox Jul 31 '15 at 14:16
  • I get exception `if(name.equals("from"))` I think that somehow name becomes `null` `Caused by: java.lang.NullPointerException at carproject.hfad.com.carproject.UiFragment$XmlParser.doInBackground(UiFragment.java:340) at carproject.hfad.com.carproject.UiFragment$XmlParser.doInBackground(UiFragment.java:281)` – David Jul 31 '15 at 14:23
  • In example I've wrote if("from".equals(currentName)). This will process correctly "null" on right side of equals(). And you must remember name on event XmlPullParser.START_TAG and then use it on XmlPullParser.TEXT – Fox Jul 31 '15 at 14:24
  • Thank You! Now all working fine. You also need to add this line `event = myParser.next();` – David Jul 31 '15 at 14:34