2016-02-28 85 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到对象很容易。