2014-01-28 3 views
0

Писатель XML (DOM) работает не так, как ожидалось. Он отлично работает, добавляя в него песни, используя метод addSong(), который передает 3 строки в метод saveSong().переопределяет Java xml

saveSong() сохраняет их в XML, но когда я сохранить его в файл XML, он пишет, что он должен делать, но перекрывает все остальное, что он ISN»т должен делать ..

I просто нужно, чтобы это было как «список», на который вы можете продолжать добавлять песни, пожалуйста, помогите!

класса Song:

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(); 
      DOMSource dom = new DOMSource(doc); 
      StreamResult sr = new StreamResult(new File("c:\\Applications\\staff.xml")); 

      tr.transform(dom, sr); 

      System.out.println("done"); 

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

Основной класс: Передает строку addSong(), который передает их saveSong(), который записывает их в файл XML.

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

Ну, что это было * было сделано для существующего файла? Если вы хотите изменить существующий файл (например, добавление элементов), вы должны проанализировать существующий файл, добавить все соответствующие элементы и затем сохранить его снова. # –

+0

@JonSkeet Ya, я должен был добавить контент в существующий файл:) .. Мне нужно это, чтобы сохранить подробности песни, и загрузить их снова в музыкальный проигрыватель, который я сделал. Вы знаете хорошие обучающие программы для синтаксиса - добавьте - сохраните? звучит очень сложно для меня .. Спасибо за вашу помощь! -/Oliver –

+2

Вместо того, чтобы искать один учебник, почему бы вам не исследовать каждую тему? Должно быть десятки тысяч страниц, показывающих, как вы можете разбирать XML-файл на Java, например. –

ответ

1

Я не тестировал этот код, пожалуйста, измените соответствующим образом.

try{ 
    // open your existing xml file first 
     FileInputStream in=new FileInputStream("c:\\Applications\\staff.xml");   

     DocumentBuilderFactory song = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder songBuilder = song.newDocumentBuilder(); 
      // Parse this file as input document 
     Document docIn=builderel.parse(staff.xml); 
     //Define your root Element here, I am assuming it as <root> 
     Element root; 
     // now we will add all elements in your root 
     Element playlist = root.createElement("playlist"); 
     // Now add all new childs in root.Here i am adding only one. Add rest of the child as per your need in root 
      root.appendChild(playlist); 
     //Now add this new root in your output doc 
      docIn.appendChild(root); 
     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer tr = tf.newTransformer(); 
     DOMSource dom = new DOMSource(docIn); 
     StreamResult sr = new StreamResult(new File("c:\\Applications\\staff.xml")); 

     tr.transform(dom, sr); 

     System.out.println("done"); 

Вы должны определить пустой staff.xml первый, имеющий только корневой узел в нем,

c:\\Applications\\staff.xml 

<?xml version="1.0" encoding="UTF-8"?> 
       <root></root> 

Я надеюсь, вы получите идею прямо сейчас. Подводя итог,

Мы открываем выше staff.xml

Добавление всех элементов в существующем корневом узле.

Переопределить существующий файл с новыми элементами вместе с существующим.

Ваш выход будет,

<?xml version="1.0" encoding="UTF-8"?> 
       <root> 
       <playist></playlist> 
       <playist></playlist> 
       <playist></playlist> 
       .... 
       </root> 

И когда в следующий раз, когда вы будете открывать свой staff.xml и разобрать его, как docIn существующего списка воспроизведения узел не получит переопределение, как вы добавляете в существующем корневом узле. возьми?

Смежные вопросы