Написание Java XML

#java #xml #dom

#java #xml #dom

Вопрос:

Я собрал некоторый код из источников в Интернете. Мне просто нужно что-то, что добавляется в конец 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>
  

Ответ №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.. Я знаю… не настоящий ответ, но определенно интересный.

Комментарии:

1. Это очень интересно

2. @Vikings1028 может быть, в этом разница между OpenJDK и Oracle JDK .. Я думаю, что моя Java 11 — это OpenJDK, а моя Java 8 — Oracle JDK… но я не уверен, правильно ли я это помню, и я понятия не имею, как это выяснить.

3. Если вы используете OpenJDK bugs.openjdk.java.net/browse /… и bugs.openjdk.java.net/browse/JDK-8223291 может быть, как-то «ответить» на ваш вопрос