【问题标题】:Create XML elements from user input从用户输入创建 XML 元素
【发布时间】:2016-06-11 14:44:00
【问题描述】:

我正在尝试从控制台获取用户输入并将其输入 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");

有没有办法使用上面的循环来创建和附加元素。如果没有,我还能怎么做?

【问题讨论】:

  • 你不应该这样给你的节点编号。将它们全部命名为Note,任何关心它们的顺序的代码都可以通过它们在Notes节点中的顺序来确定它,或者你可以添加一个“数字”属性

标签: java xml string dom nsxmlelement


【解决方案1】:
  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的属性(使用Document中的createAttribute方法,类似于createElement)。

【讨论】:

  • 不错的列表开始。让我补充一下:4)在循环中调用nextLine() 两次是不正确的。检查bol 的值"END"break 循环,并使循环本身无休止,例如for (;;) { ... }.
  • 5) 带有用户注释的子元素都应该被称为相同的,而不是顺序编号(n1n2n3,...)。如果确实需要编号,请添加另一个属性。 XML 文件的“模式”是静态的,因此动态地创造新元素是不好的。
  • 如果您喜欢我的补充,请添加到您的答案中。 ;-)
【解决方案2】:

我建议您创建一个对象“Note”并使用 JAXB。请参阅本教程: Tutorial。将对象转换为 XML 和 XML 转换为对象很容易。

【讨论】:

    猜你喜欢
    • 2015-10-24
    • 2019-02-17
    • 1970-01-01
    • 2023-04-10
    • 2021-12-13
    • 2018-05-24
    • 2013-09-24
    • 2020-07-15
    • 1970-01-01
    相关资源
    最近更新 更多