如何避免在用Java生成XML时出现多余的空白行?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何避免在用Java生成XML时出现多余的空白行?相关的知识,希望对你有一定的参考价值。

[当前,我正在尝试使用Java 9和javax.xml库(对我的任务都是必不可少的)来开发一些代码,这些代码可编辑XML文件,并且在添加子节点时遇到一些奇怪的问题。

这是XML文件:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
</users>

而且我想对其进行编辑以构建如下内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
    <user>
        <name>A name</name>
        <last-name>Last Name</last-name>
        <username>username</username>
    </user>
</users>

现在,代码的第一轮运行在<user>节点之前添加了一个空白行。当它第二次运行时,将填充更多的空白行:

<users>


    <user>

        <name>name</name>

        <last-name>lastname</last-name>

        <username>username</username>

    </user>

    <user>
        <name>name</name>
        <last-name>lastname</last-name>
        <username>username</username>
    </user>
</users>

这是程序运行两次后生成的XML。如您所见,它在<user>节点之前和其他节点之间添加了空行,而节点之间恰好n-1的空行是执行代码的n倍。

在更新文件之前,我想知道那些节点的内容是什么,我写了下一个代码:

int i=0;
while (root.getChildNodes().item(i)!=null){
  Node aux = root.getChildNodes().item(i);
  System.out.println("Node text content: ".concat(aux.getTextContent()));
  i++;
}

第一次执行:

Node text content: 

Node text content: namelastnameusername

第二次执行:

Node text content: 


Node text content: 
        name
        lastname
        username

Node text content: 

Node text content: namelastnameusername

第三次执行

Node text content: 



Node text content: 

        name

        lastname

        username


Node text content: 


Node text content: 
        name
        lastname
        username

Node text content: 

Node text content: namelastnameusername

最后,这是Java代码:

private static void saveUser(String firstName, String lastName, String username){
  DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
    try {
      DocumentBuilder builder = factory.newDocumentBuilder();
      Document doc = builder.parse(new File(databaseFile));
      Element root = doc.getDocumentElement();
      root.normalize();

      // build user node
      Element userNode = doc.createElement("user");
      Element nameNode =  doc.createElement("name");
      Element lastNameNode = doc.createElement("last-name");
      Element usernameNode = doc.createElement("username");

      //build structure
      nameNode.appendChild(doc.createTextNode(firstName));
      lastNameNode.appendChild(doc.createTextNode(lastName));
      usernameNode.appendChild(doc.createTextNode(username));

      userNode.appendChild(nameNode);
      userNode.appendChild(lastNameNode);
      userNode.appendChild(usernameNode);
      root.appendChild(userNode);

      //write the updated document to file or console
      TransformerFactory transformerFactory = TransformerFactory.newInstance();
      Transformer transformer = transformerFactory.newTransformer();
      DOMSource source = new DOMSource(doc);
      StreamResult result = new StreamResult(new File(databaseFile));
      transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
      transformer.setOutputProperty(OutputKeys.INDENT, "yes");
      transformer.transform(source, result);
    }catch (SAXException | ParserConfigurationException | IOException | TransformerException e1) {
      e1.printStackTrace();
    }
}

我唯一能找到的解决方案是在XML生成后删除空白行,但是我认为这不是一个合适的解决方案,我想先找到一些替代方案。

关于如何解决此问题的任何建议?

答案

无法使用Oracle jdk1.8.0_181复制。

初始文件内容:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
</users>

第一次运行后:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
<user>
<name>A name</name>
<last-name>Last Name</last-name>
<username>username</username>
</user>
</users>

第二次运行后:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
<user>
<name>A name</name>
<last-name>Last Name</last-name>
<username>username</username>
</user>
<user>
<name>A name</name>
<last-name>Last Name</last-name>
<username>username</username>
</user>
</users>

第三次运行后:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<users>
<user>
<name>A name</name>
<last-name>Last Name</last-name>
<username>username</username>
</user>
<user>
<name>A name</name>
<last-name>Last Name</last-name>
<username>username</username>
</user>
<user>
<name>A name</name>
<last-name>Last Name</last-name>
<username>username</username>
</user>
</users>

以上是关于如何避免在用Java生成XML时出现多余的空白行?的主要内容,如果未能解决你的问题,请参考以下文章

用jquery.qrcode.min.js生成二维码,在用局域网ip访问时出现js错误,对象不支持getcontext()方法或属性

Java 读写 XML 数据文件时出现“文件过早结束”错误

Word打印预览时出现空白页怎么回事、如何删除?

在用QT编程时,建了一个自己的类,但是编译时出现错误,求教大侠们如何解决

如何避免在 jQuery 动画 [fadeIn() 或 animate()] 结束时出现文本闪烁?

创建“Nokogiri::XML”或“Nokogiri::HTML”对象时如何避免创建无意义的空白文本节点