java - 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>
解决方案
我刚刚注意到,当我使用 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 中的一个错误。我知道……这不是一个真正的答案,但绝对很有趣。
推荐阅读
- python-3.x - 从担任的角色担任角色
- arrays - -> 条件的任何快捷方式?['yes'] : ['yes', 'no'] 飞镖?
- parameter-passing - 如何将数组参数传递到 ADF 数据流
- nested - 在使用 gtsummary 对两个分类变量上的连续变量进行汇总时,如何添加每个类别的观察数?
- android - Google Play - 将版本从内部轨道推广到生产和 Google 审查
- c# - c# VSTO 问题与正确的语法 - activeWindow 是资源管理器
- mesh - 我们如何在 MeshLab 中以数值方式评估曲面重建算法的准确性?
- c++ - 对 VS 代码使用 C/C++ 扩展,无需安装任何编译器
- c++ - C ++中的条件变量wait_for
- javascript - 如何修剪在Javascript中有多行的字符串