2016-02-28 100 views
1

我試圖從控制檯接收用戶輸入並將其提供給XML文件。 Evrytime用戶移動到下一行我想要輸入它們的字符串並創建一個新元素。 這是我想實現:從用戶輸入創建XML元素

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<note> 
    <header> 
     <Tempo Laya="2"/> 
    </header> 
    <Notes> 
    <n1 Bol="Text the user entered"/> 
    <n2 Bol="Text the user entered over the next iteration"/> 
    <n3 Bol="Text the user entered over the next iteration"/> 
    </Notes> 
</note> 

我認爲這樣做會然而,創建這些元素,最好的辦法;我無法通過此創建獨特的元素名稱。這是我到目前爲止的代碼:

//Create note element 
    Element notes = doc.createElement("Notes"); 
    rootElement.appendChild(notes); 
    System.out.println("Input your notes matraa by maatra. To proceed to the next maatra press ENTER. \n To exit enter END"); 
    do{ 
     int noteCount = 1; 
     System.out.println("Maatra: "); 
     bol = scanner.nextLine(); 


    }while(scanner.nextLine()!= "END"); 

有什麼辦法來創建和附加使用上述循環的元素。如果不是我可以怎麼做呢?

+0

你不應該這樣編號你的節點。將它們全部命名爲'Note',並且任何代碼關心它們的順序都可以通過它們在Notes節點中的順序來確定它,或者您可以添加一個「數字」屬性 – Bohemian

回答

4
  1. 首先,您在檢查"END"字符串時出錯。您應該使用String.equals而不是引用相等。還撥打nextLine()兩次讀取兩行而不是一行。只是檢查第一讀取線:

    while(bol.equals("END")); 
    
  2. 其次,它會更容易使用JAXB執行此任務。每當用戶添加新輸入時,都會在內存中添加一個新對象,而不是手動處理文檔樹。一旦收到"END",內容將被編組爲文檔。

    您可以在Oracle tutorials中閱讀JAXB簡介。

  3. 如果你仍然想使用標準DOM來做到這一點,你需要做這樣的事情:

    Element noteElement = doc.createElement("note"); 
    notes.appendChild(noteElement); 
    

    這意味着,作爲@Andreas下面評論,元素最好應具有相同的名稱,沒有順序編號(n1,n2,n3,...)。如果確實需要編號,可以添加另一個包含該id的屬性(使用類似於createElementDocument中的方法createAttribute)。

+1

尼斯列表開始。讓我補充一下:4)在循環中調用'nextLine()'兩次是不正確的。檢查'bol'爲值'「END」'和'break'循環,並且使循環本身永無止境,例如, 'for(;;){...}'。 – Andreas

+1

5)帶有用戶註釋的子元素應該全部被調用,而不是順序編號('n1','n2','n3',...)。如果確實需要編號,請添加其他屬性。 XML文件的「模式」是靜態的,因此動態創建新元素是不好的。 – Andreas

+0

如果您喜歡我的附加內容,請添加到您的答案中。 ;-) – Andreas

0

我建議你創建一個「Note」對象並使用JAXB。請參閱本教程: Tutorial。將對象轉換爲XML和XML到對象很容易。