XML 文件在 Java 中读写后丢失格式
XML File looses its format after reading and writing in Java
我正在 Java 中编写一个程序,它将读取 XML 文件并进行一些修改,然后以相同的格式写入文件。
下面是读写XML文件的代码块:
final Document fileDocument = parseFileAsDocument(file);
final OutputFormat format = new OutputFormat(fileDocument);
try {
final FileWriter out = new FileWriter(file);
final XMLSerializer serializer = new XMLSerializer(out,format);
serializer.serialize(fileDocument);
}
catch (final IOException e) {
System.out.println(e.getMessage());
}
这是用来解析文件的方法:
private Document parseFileAsDocument(final File file) {
Document inputDocument = null;
try {
inputDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
}//catching some exceptions{}
return inputDocument;
}
我注意到文件写入后有两个变化:
在我有一个类似这样的节点之前:
<instance ref='filter'>
<value></value>
</instance>
读写后的节点是这样的:
<instance ref="filter">
<value/>
</instance>
从上面可以看出,'filter' 已更改为带双引号的 "filter"。
第二个变化是 <value></value>
已更改为 <value/>
。只要我们有一个类似于 <tag></tag>
且中间没有值的节点,这种更改就会在 XML 文件中发生。所以如果我们有类似 <tag>somevalue</tag>
的东西,就没有问题。
有没有想过如何使 XML 节点格式在写入后相同?
非常感谢!
你不能,也不应该尝试。这有点像抱怨当你添加 0123 和 0234 时,你得到没有前导零的 357。整数中的前导零不被认为是重要的,因此算术运算不会保留它们。 XML 的无关紧要的细节也会发生同样的情况,例如双引号和单引号之间的区别,以及自闭合标签和空元素的 start/end 标签对之间的区别。如果 XML 的任何消费者依赖于这些详细信息,则需要将他们送去接受再培训。
要求保留词汇细节的最常见原因是您想要检测变化。但这意味着您以错误的方式进行比较:您应该在逻辑层面而不是物理层面进行比较。进行比较的一种方法是规范化 XML,因此无论何时在等效表示之间进行任意选择,都会以相同的方式进行。
我正在 Java 中编写一个程序,它将读取 XML 文件并进行一些修改,然后以相同的格式写入文件。
下面是读写XML文件的代码块:
final Document fileDocument = parseFileAsDocument(file);
final OutputFormat format = new OutputFormat(fileDocument);
try {
final FileWriter out = new FileWriter(file);
final XMLSerializer serializer = new XMLSerializer(out,format);
serializer.serialize(fileDocument);
}
catch (final IOException e) {
System.out.println(e.getMessage());
}
这是用来解析文件的方法:
private Document parseFileAsDocument(final File file) {
Document inputDocument = null;
try {
inputDocument = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(file);
}//catching some exceptions{}
return inputDocument;
}
我注意到文件写入后有两个变化: 在我有一个类似这样的节点之前:
<instance ref='filter'>
<value></value>
</instance>
读写后的节点是这样的:
<instance ref="filter">
<value/>
</instance>
从上面可以看出,'filter' 已更改为带双引号的 "filter"。
第二个变化是 <value></value>
已更改为 <value/>
。只要我们有一个类似于 <tag></tag>
且中间没有值的节点,这种更改就会在 XML 文件中发生。所以如果我们有类似 <tag>somevalue</tag>
的东西,就没有问题。
有没有想过如何使 XML 节点格式在写入后相同?
非常感谢!
你不能,也不应该尝试。这有点像抱怨当你添加 0123 和 0234 时,你得到没有前导零的 357。整数中的前导零不被认为是重要的,因此算术运算不会保留它们。 XML 的无关紧要的细节也会发生同样的情况,例如双引号和单引号之间的区别,以及自闭合标签和空元素的 start/end 标签对之间的区别。如果 XML 的任何消费者依赖于这些详细信息,则需要将他们送去接受再培训。
要求保留词汇细节的最常见原因是您想要检测变化。但这意味着您以错误的方式进行比较:您应该在逻辑层面而不是物理层面进行比较。进行比较的一种方法是规范化 XML,因此无论何时在等效表示之间进行任意选择,都会以相同的方式进行。