首页 > 解决方案 > Java XML 编写

问题描述

我从互联网上的资源中收集了一些代码。我只需要附加到 XML 文件末尾的东西。

当我使用此代码时,它会正确格式化新条目,但之前存在的 xml 也会被进一步隔开。我希望它添加到结尾而不触及之前的任何内容。没有transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount","2"),它只会将所有新内容输出到一行。

package xml;

import java.util.*;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;

public class Writer {
    
    public static void main(String[] args) throws Exception {

        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        Document document = documentBuilder.parse("input.xml");
        Element root = document.getDocumentElement();

        Element newUser = document.createElement("user");

        Element name = document.createElement("name");
        name.appendChild(document.createTextNode("test_name"));
        newUser.appendChild(name);

        Element username = document.createElement("username");
        username.appendChild(document.createTextNode("test_username"));
        newUser.appendChild(username);
        
        Element email = document.createElement("email");
        email.appendChild(document.createTextNode("test_email"));
        newUser.appendChild(email);
        
        Element password = document.createElement("password");
        password.appendChild(document.createTextNode("test_password"));
        newUser.appendChild(password);

        root.appendChild(newUser);

        DOMSource source = new DOMSource(document);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount","2");
        StreamResult result = new StreamResult("input.xml");
        transformer.transform(source, result);
        
    }
}

代码运行前的 XML

<?xml version = "1.0"?>
<Test>

   <user>
      <name>alpha</name>
      <username>alpha1</username>
      <email>alpha@gmail.com</email>
      <password>a</password>
   </user>
   
   <user>
      <name>beta</name>
      <username>beta1</username>
      <email>beta@gmail.com</email>
      <password>b</password>
   </user>
   
   <user>
      <name>omega</name>
      <username>omega1</username>
      <email>omega@gmail.com</email>
      <password>w</password>
   </user>

</Test>

代码运行后的 XML

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<Test>
     
  <user>
          
    <name>alpha</name>
          
    <username>alpha1</username>
          
    <email>alpha@gmail.com</email>
          
    <password>a</password>
       
  </user>
     
   
  <user>
          
    <name>beta</name>
          
    <username>beta1</username>
          
    <email>beta@gmail.com</email>
          
    <password>b</password>
       
  </user>
     
   
  <user>
          
    <name>omega</name>
          
    <username>omega1</username>
          
    <email>omega@gmail.com</email>
          
    <password>w</password>
       
  </user>
  
  <user>
    <name>test_name</name>
    <username>test_username</username>
    <email>test_email</email>
    <password>test_password</password>
  </user>
</Test>

标签: javaxmldom

解决方案


我刚刚注意到,当我使用 java 11 运行您的代码时,我会得到与您相同的结果,但是如果我更改为 java 8,则会得到以下结果

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

   <user>
      <name>alpha</name>
      <username>alpha1</username>
      <email>alpha@gmail.com</email>
      <password>a</password>
   </user>
   
   <user>
      <name>beta</name>
      <username>beta1</username>
      <email>beta@gmail.com</email>
      <password>b</password>
   </user>
   
   <user>
      <name>omega</name>
      <username>omega1</username>
      <email>omega@gmail.com</email>
      <password>w</password>
   </user>

<user>
    <name>test_name</name>
    <username>test_username</username>
    <email>test_email</email>
    <password>test_password</password>
  </user>
</Test>

(是的,缩进就是这样的)

所以这看起来像是 java / jdk 中的一个错误。我知道……这不是一个真正的答案,但绝对很有趣。


推荐阅读