Search code examples
androidxml-parsingandroid-xmldomparserandroid-parser

Error While Parsing XML file Using Xml DOMParser : Android


I am having XML file. Structure of the XML file is HERE :

<albumlist>
       <album value="Enrique Iglesias"><details value="1995"/>
              <imageid value="eenrique"/>
              <songs value="No Llores Por Mi">
                     <lyrics>hhhehhehhehe </lyrics>
              </songs>
              <songs value="Trapecista">
                     <lyrics>hhhehhehhehe </lyrics>
              </songs>
              <songs value="Por Amarte">
                      <lyrics>hhhehhehhehe </lyrics>
              </songs>
       </album>
</albumlist>

I want to extract lyrics for perticular song for perticuler album. For that i have written code which shows me songs list but for that perticuler song i am not able to extract lyrics.

Here is my function to get lyrics :

private String[] getLyrics() {
        // TODO Auto-generated method stub
        try {
            InputStream in = getResources().openRawResource(R.raw.data);
            DocumentBuilder builder = DocumentBuilderFactory.newInstance()
                    .newDocumentBuilder();
            Document doc = builder.parse(in, null);
            NodeList albumnode = doc.getElementsByTagName("album");
            for (int k = 0; k < albumnode.getLength(); k++) 
            {
                if (((Element) albumnode.item(k)).getAttribute("value").equals(albumname))
                {
                    NodeList nd = albumnode.item(k).getChildNodes();

                    for (int j = 0; j < nd.getLength(); j++) {

                        Node subNode = nd.item(j);
                        if (subNode.getNodeName().equals("songs")) {
                            if (subNode.hasAttributes()) {
                                NamedNodeMap nnm = subNode.getAttributes();

                                for (int i = 0; i < nnm.getLength(); i++) {
                                    Node attrNode = nnm.item(i);

                                    if (attrNode.getNodeType() == Node.ATTRIBUTE_NODE) {
                                        Attr attribute = (Attr) attrNode;
                                        String value = attribute.getValue();
                                        if (value.equals(songname)) {
                                            NodeList lyricslist = subNode
                                                    .getChildNodes();
                                            for(int m=0 ; m<lyricslist.getLength();m++)
                                            {
                                                Node lyricsnode = lyricslist.item(m);
                                                if (lyricsnode.getNodeType() == Node.TEXT_NODE) {
                                                    //Attr attribute = (Attr) attrNode;
                                                    String value1 = lyricsnode.getNodeValue();
                                                    Lyrics[0]=value1;
                                                    Toast.makeText(getApplicationContext(), ""+value1, Toast.LENGTH_LONG).show();
                                                }
                                            }


                                        }
                                    }
                                }
                            }
                        }
                    }

                }
            }
            in.close();
        }

        catch (Exception t) {
            Toast.makeText(this, "Exception: " + t.getMessage(),
                    Toast.LENGTH_LONG).show();
        }
        return Lyrics;
    }

So what is the mistake in my code. I spent my whole day to solve it. But unfortunately i am not able to identify my mistake. Pleaze solve my issue. Thanx.


Solution

  • Use this link for SAX parser

    And also see the difference b/w sax and dom diffrence

    Just use this parser to parse your xml

    public class EmployeeParser extends DefaultHandler {
    
        private StringBuilder responseTag;
        private List<Album> listAblum = new ArrayList<Album>();
        private Album album;
    
        @Override
        public void startDocument() throws SAXException {
            super.startDocument();
    
            listAblum.clear();
        }
    
        @Override
        public void endDocument() throws SAXException {
            super.endDocument();
    
        }
    
        @Override
        public void startElement(String uri, String localName, String qName,
                Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
    
            responseTag = new StringBuilder();
            if (localName.equals("album")) {
                album = new Album();
                album.setAlbumValue(attributes.getValue("value"));
            } else if ("imageid".equals(localName)) {
                album.setDetails(attributes.getValue("value"));
            } else if ("songs".equals(localName)) {
                album.setSongs(attributes.getValue("value"));
            }
        }
    
        @Override
        public void endElement(String uri, String localName, String qName)
                throws SAXException {
            super.endElement(uri, localName, qName);
    
            if (localName.equals("album")) {
                listAblum.add(album);
            } else if ("lyrics".equals(localName)) {
                album.setLyrics(responseTag.toString());
            }
    
        }
    
        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            super.characters(ch, start, length);
            String str = new String(ch, start, length);
            responseTag.append(str);
        }
    
        class Album {
            private String songs, imageId, lyrics, albumValue, details;
    
            public String getSongs() {
                return songs;
            }
    
            public void setSongs(String songs) {
                this.songs = songs;
            }
    
            public String getImageId() {
                return imageId;
            }
    
            public void setImageId(String imageId) {
                this.imageId = imageId;
            }
    
            public String getLyrics() {
                return lyrics;
            }
    
            public void setLyrics(String lyrics) {
                this.lyrics = lyrics;
            }
    
            public String getAlbumValue() {
                return albumValue;
            }
    
            public void setAlbumValue(String albumValue) {
                this.albumValue = albumValue;
            }
    
            public String getDetails() {
                return details;
            }
    
            public void setDetails(String details) {
                this.details = details;
            }
        }
    }