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?

3
  • value = myParser.getAttributeValue(null, "from"); you tried this? Commented Jul 31, 2015 at 13:44
  • Yes, but still return null Commented Jul 31, 2015 at 13:46
  • actually if <from value="Jani"/> then only value = myParser.getAttributeValue(null, "value"); will return value = Jani. Commented Jul 31, 2015 at 13:52

2 Answers 2

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.

Sign up to request clarification or add additional context in comments.

Comments

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

5 Comments

Thanks, but my program crash after this.
What line program crashed?
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)
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
Thank You! Now all working fine. You also need to add this line event = myParser.next();

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.