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,因此无论何时在等效表示之间进行任意选择,都会以相同的方式进行。