#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 может быть, как-то «ответить» на ваш вопрос