【问题标题】:XML File looses its format after reading and writing in Java用 Java 读写 XML 文件后格式丢失
【发布时间】:2015-01-15 19:17:24
【问题描述】:

我正在用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>

从上面可以看出,“过滤器”已更改为带有双引号的“过滤器”。 第二个更改是&lt;value&gt;&lt;/value&gt; 已更改为&lt;value/&gt;。每当我们有一个类似于&lt;tag&gt;&lt;/tag&gt; 的节点且其间没有任何值时,XML 文件都会发生这种变化。因此,如果我们有类似&lt;tag&gt;somevalue&lt;/tag&gt; 的内容,则没有问题。 有什么想法请在编写后如何使 XML 节点格式相同? 我会很感激的!

【问题讨论】:

标签: java xml xml-parsing


【解决方案1】:

你不能,也不应该尝试。这有点像抱怨当你添加 0123 和 0234 时,你得到的 357 没有前导零。整数中的前导零不被认为是重要的,因此算术运算不会保留它们。 XML 的无关紧要的细节也会发生同样的情况,例如双引号和单引号之间的区别,以及自闭合标签和空元素的开始/结束标签对之间的区别。如果 XML 的任何使用者依赖于这些详细信息,则需要将其送去进行再培训。

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

【讨论】:

  • 非常感谢您的出色回答,我完全同意您的看法!我担心这些更改的原因是因为我正在修改一些由某些 IDE 生成的 XML 文件,并且我正在这样做读写以对它们进行一些修改。所以我担心在从单引号更改为双引号以及从 更改为 之后,IDE 将无法正确解释这些文件。但经过一些初步测试后,一切似乎都运行良好。
  • 另外,这些文件没有 .xml 扩展名,它们没有任何文件扩展名,但是打开它们后,我可以看到 ' 所以我认为它们是仅适用于该 IDE 的一些特定 XML 文件。
  • 别担心。 XML 文件具有 .xml 以外的文件扩展名是完全可以的,而且它们完全可以(确实,推荐)以第一行的 XML 声明开头。
猜你喜欢
  • 1970-01-01
  • 2014-07-16
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-14
  • 1970-01-01
  • 2012-11-19
相关资源
最近更新 更多