【问题标题】:Java XML WritingJava XML 编写
【发布时间】:2021-02-25 20:49:02
【问题描述】:

我从互联网上搜集了一些代码。我只需要附加到 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>

【问题讨论】:

    标签: java xml dom


    【解决方案1】:

    我刚刚注意到,当我使用 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 中的一个错误。我知道...不是真正的答案,但绝对很有趣。

    【讨论】:

    • 这很有趣
    • @Vikings1028 可能是 OpenJDK 和 Oracle JDK 之间的区别 .. 我认为我的 Java 11 是 OpenJDK 而我的 Java 8 是 Oracle JDK ......但我不确定我是否记得正确并且我不知道如何找到。
    • 如果您使用 OpenJDK bugs.openjdk.java.net/browse/…bugs.openjdk.java.net/browse/JDK-8223291 可能会以某种方式“回答”您的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多