Question

I have a xml like below, I tried to parse it with XmlPullParser in android by below code, every thing is right the only problem is I can not parse the url tag attributes, it returns null, what is the problem?

XML:

<doc>
 <urls>
  <url isIR="false" bitrate="320" extension="MP3" size="9.9MB">
  http://example.mp3
  </url>
 </urls>
 <caption>
  <![CDATA[ don t bother ]]>
 </caption>
 <artist>
  <![CDATA[ shakira ]]>
 <artist>
 <album>
  <![CDATA[ star mark greatest hits (cd) ]]>
 <album>
</doc>

Code:

while (eventType != XmlPullParser.END_DOCUMENT) {
            String tagname = parser.getName();
            switch (eventType) {
            case XmlPullParser.START_TAG:
                if (tagname.equalsIgnoreCase("doc")) {
                    ava = new Ava2();
                }
                break;

            case XmlPullParser.TEXT:
                text = parser.getText();
                break;

            case XmlPullParser.END_TAG:
                if (tagname.equalsIgnoreCase("doc")) {
                    avaList.add(ava);
                } else if (tagname.equalsIgnoreCase("url")) {
                    ava.setUrl(text);
                    ava.setBitrate(parser.getAttributeValue(null, "bitrate"));
                    ava.setSize(parser.getAttributeValue(null, "size"));
                } else if (tagname.equalsIgnoreCase("caption")) {
                    ava.setCaption(text);
                } else if (tagname.equalsIgnoreCase("artist")) {
                    ava.setArtist(text);
                } else if (tagname.equalsIgnoreCase("album")) {
                    ava.setAlbum(text);
                }

                break;

            default:
                break;
            }
            eventType = parser.next();
        }
Was it helpful?

Solution

Try this..

           else if (tagname.equalsIgnoreCase("url")) {
                ava.setUrl(text);
                for(int i =0 i < parser.getAttributeCount(); i++){
                   if(parser.getAttributeName(i).equals("bitrate")){
                       ava.setBitrate(parser.getAttributeValue(i));
                   }else if(parser.getAttributeName(i).equals("size")){
                       ava.setSize(parser.getAttributeValue(i));
                   }
                }
            }

EDIT:

        case XmlPullParser.START_TAG:
            if (tagname.equalsIgnoreCase("doc")) {
                ava = new Ava2();
            }
            if (tagname.equalsIgnoreCase("doc")) {
                avaList.add(ava);
            } else if (tagname.equalsIgnoreCase("url")) {
                ava.setUrl(text);
                ava.setBitrate(parser.getAttributeValue(null, "bitrate"));
                ava.setSize(parser.getAttributeValue(null, "size"));
            } else if (tagname.equalsIgnoreCase("caption")) {
                ava.setCaption(text);
            } else if (tagname.equalsIgnoreCase("artist")) {
                ava.setArtist(text);
            } else if (tagname.equalsIgnoreCase("album")) {
                ava.setAlbum(text);
            }
            break;

OTHER TIPS

You need to first parse "urls" tag and then "url" tag.

You need to use parser.getAttributeName() and parser.getAttributeValue() functions.

When the case is START_TAG you can get a count of tags using parser.getAttributeCount() and then use a for loop from 0 to count -1 and pass the loop integer to getAttributeName and getAttributeValue funcitons.

int count=parser.getAttributeCount();
if(count!= -1) {


    for(int i=0;i<count;i++) {

        String name = parser.getAttributeName(i);
        String value = parser.getAttributeValue(i);
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top