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.

有帮助吗?

解决方案

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;
        }
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top