0

我有 XML 文件。XML 文件的结构在这里:

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

我想为 perticuler 专辑提取特定歌曲的歌词。为此,我编写了显示歌曲列表的代码,但对于那首特别的歌曲,我无法提取歌词。

这是我获取歌词的功能:

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

那么我的代码中的错误是什么。我花了一整天的时间来解决它。但不幸的是,我无法确定我的错误。请解决我的问题。谢谢。

4

1 回答 1

1

将此链接用于SAX 解析器

还可以看到 b/w sax 和 dom 的区别

只需使用此解析器来解析您的 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;
        }
    }
}
于 2013-02-23T12:56:19.110 回答