XML文件在Java中读写后丢失了格式

时间:2015-01-15 19:17:24

标签: java xml xml-parsing

我用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节点格式相同? 我很感激!

1 个答案:

答案 0 :(得分:0)

你不能,你不应该尝试。这有点像抱怨当你添加0123和0234时,你获得357没有前导零。整数中的前导零并不重要,因此算术运算不会保留它们。同样发生在XML的无关紧要的细节上,例如双引号和单引号之间的区别,以及自闭合标记与空元素的开始/结束标记对之间的区别。如果XML的任何消费者依赖于这些细节,则需要将它们发送给进行再培训。

要求保留词法详细信息的最常见原因是您要检测更改。但这意味着您正在以错误的方式进行比较:您应该在逻辑层面进行比较,而不是在物理层面进行比较。进行比较的一种方法是规范化XML,因此只要在等效表示之间进行任意选择,它就会以相同的方式进行。