Java xml解析器传递错误

时间:2014-02-03 19:09:15

标签: java xml

我创建了一个java xml解析器,它几乎成功地存储了数据,至少它第一次被调用。它创建版本号,UTF和它应该做的"树"。

但第二次调用该方法时,它只是创建一个新的"树"和版本,它不应该做(不要覆盖,看看附图!

我需要xml解析器做的是,第一次调用该方法时,它将生成版本,UTF和"树"。下次调用它时,它只会将数据添加到新的歌曲"节点。

我为我的英语道歉,但我希望它的解释清楚。另外,请在评论中进一步询问,我更容易用评论来解释! link to picture

代码:

public class Song {
List<String[]> songs = new ArrayList<String[]>();

public void addSong(String s, String a, String yt){
    String[] songarray= new String[3];
    songarray[0] = s;
    songarray[1] = a;
    songarray[2] = yt;
    songs.add(songarray);
    saveSong(songarray);



}
public void editSong(int i, String s, String a, String yt){
    String[] editsongarray = new String[3];
    editsongarray[0] = s;
    editsongarray[1] = a;
    editsongarray[2] = yt;
    songs.remove(i);
    songs.add(i,editsongarray);
}
public void removeSong(int i){
    songs.remove(i);
}

public String[] getList(int i){
    String[] j = songs.get(i);
    return j;
}
public void saveSong(String[] songl){
    try{

        DocumentBuilderFactory song = DocumentBuilderFactory.newInstance();
            DocumentBuilder songBuilder = song.newDocumentBuilder();

            Document doc = songBuilder.newDocument();
            Element playlist = doc.createElement("playlist");
            doc.appendChild(playlist);

            Element songs = doc.createElement("songs");
            playlist.appendChild(songs);

            Attr attr = doc.createAttribute("index");
            attr.setValue("1");
            playlist.setAttributeNode(attr);


            Element name = doc.createElement("name");
            name.appendChild(doc.createTextNode(songl[0]));
            songs.appendChild(name);

            Element artistname = doc.createElement("artistname");
            artistname.appendChild(doc.createTextNode(songl[1]));
            songs.appendChild(artistname);

            Element youtubeurl = doc.createElement("youtubeurl");
            youtubeurl.appendChild(doc.createTextNode(songl[2]));
            songs.appendChild(youtubeurl);

            TransformerFactory tf = TransformerFactory.newInstance();
            Transformer tr = tf.newTransformer();
            tr.setOutputProperty(OutputKeys.INDENT, "yes");
            DOMSource dom = new DOMSource(doc);
            StreamResult sr = new StreamResult(new FileOutputStream("c:\\Applications\\staff.xml",true));

            tr.transform(dom, sr);

            System.out.println("done");

        }catch(ParserConfigurationException pce){
            pce.printStackTrace();
        }catch(TransformerException fce){
            fce.printStackTrace();
        }catch(IOException ie){
            ie.printStackTrace();
        }
    }
}

主要方法:

public class main {
public static void main(String[] args){
    Song Song = new Song();
    Song.addSong("This is", "A very good","Song");
}

}

1 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,那就是每次添加新歌曲时,您最终都会得到一个仅包含该歌曲的全新XML文档。

您正在创建要保存的所有歌曲的集合,但是当您调用saveSong时,您没有使用它。你也在制作一个与Collection同名的元素,它在语法上是有效的(谢谢,范围!),但有点令人困惑。

解决这个问题的最简单方法是停止将新添加的歌曲传递给saveSong,然后循环播放歌曲(Collection)并将部分添加到循环中。

所以这个

Element name = doc.createElement("name");
name.appendChild(doc.createTextNode(songl[0]));
songs.appendChild(name);

Element artistname = doc.createElement("artistname");
artistname.appendChild(doc.createTextNode(songl[1]));
songs.appendChild(artistname);

Element youtubeurl = doc.createElement("youtubeurl");
youtubeurl.appendChild(doc.createTextNode(songl[2]));
songs.appendChild(youtubeurl);

成为

for (String[] songl: this.songs) {

Element name = doc.createElement("name");
name.appendChild(doc.createTextNode(songl[0]));
songs.appendChild(name);

Element artistname = doc.createElement("artistname");
artistname.appendChild(doc.createTextNode(songl[1]));
songs.appendChild(artistname);

Element youtubeurl = doc.createElement("youtubeurl");
youtubeurl.appendChild(doc.createTextNode(songl[2]));
songs.appendChild(youtubeurl);
}