我用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>
从上面可以看出,&#39;过滤器&#39;已更改为&#34;过滤&#34;双引号。
第二个更改<value></value>
已更改为<value/>
。每当我们有一个类似于<tag></tag>
的节点且两者之间没有值时,就会在XML文件中发生此更改。因此,如果我们有类似<tag>somevalue</tag>
的内容,则没有问题。
请问如何在写完后让XML节点格式相同?
我很感激!
答案 0 :(得分:0)
你不能,你不应该尝试。这有点像抱怨当你添加0123和0234时,你获得357没有前导零。整数中的前导零并不重要,因此算术运算不会保留它们。同样发生在XML的无关紧要的细节上,例如双引号和单引号之间的区别,以及自闭合标记与空元素的开始/结束标记对之间的区别。如果XML的任何消费者依赖于这些细节,则需要将它们发送给进行再培训。
要求保留词法详细信息的最常见原因是您要检测更改。但这意味着您正在以错误的方式进行比较:您应该在逻辑层面进行比较,而不是在物理层面进行比较。进行比较的一种方法是规范化XML,因此只要在等效表示之间进行任意选择,它就会以相同的方式进行。