Java 如何检查XML文件中的更改?

Java 如何检查XML文件中的更改?,java,xml,hash,Java,Xml,Hash,我想确保两个XML文件是相同的,我看到的两个选项是相同的。 1.让XML有一个最后的修改日期和时间,并检查是否相同。问题是,有人可能会忘记改变它,然后它就没用了。 2.创建xml文件/结构的哈希代码 我使用java中的内置库,但是哈希实现可以在不同的运行中更改,这是没有帮助的 File model = new File(fileLocation); DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); D

我想确保两个XML文件是相同的,我看到的两个选项是相同的。 1.让XML有一个最后的修改日期和时间,并检查是否相同。问题是,有人可能会忘记改变它,然后它就没用了。 2.创建xml文件/结构的哈希代码

我使用java中的内置库,但是哈希实现可以在不同的运行中更改,这是没有帮助的

File model = new File(fileLocation);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(model);
doc.getHash();

有没有一种简单的方法可以做到这一点,而且希望不用导入其他库。

对文件进行排序和比较会有帮助吗

就图书馆而言, 你可以试试


有一项功能

将对文件进行排序并进行比较有帮助吗

就图书馆而言, 你可以试试


有一个特性

正如Martin Thurau所指出的,这取决于您是想检查文件是否相同,还是XML内容是否相同。这个答案仅适用于第一种情况,当您想知道两个文件是否相同时,我认为这是您的问题,因为您建议了一个哈希值

在这种情况下,构建哈希不是一个好的选择,您可以像这样更容易地解决它:

  • 检查文件大小是否相同,如果不相同
  • 打开两个文件的流
  • 只需在溪流中循环,并在第一个差异处停下来
  • 如果没有发现差异,则它们是相同的

  • 那么为什么不计算散列值呢?无论如何,您都必须读取整个文件来计算散列,因此,当您比较流时,您可以放弃计算,并且可以在第一个差异处停止计算。将文件解析为DOM模型也会有同样的缺点。

    正如Martin Thurau指出的,这取决于是否要检查文件是否相同,或者XML内容是否相同。这个答案仅适用于第一种情况,当您想知道两个文件是否相同时,我认为这是您的问题,因为您建议了一个哈希值

    在这种情况下,构建哈希不是一个好的选择,您可以像这样更容易地解决它:

  • 检查文件大小是否相同,如果不相同
  • 打开两个文件的流
  • 只需在溪流中循环,并在第一个差异处停下来
  • 如果没有发现差异,则它们是相同的

  • 那么为什么不计算散列值呢?无论如何,您都必须读取整个文件来计算散列,因此,当您比较流时,您可以放弃计算,并且可以在第一个差异处停止计算。将文件解析为DOM模型也会有同样的缺点。

    我可以从中读出不同的问题:您是想检查文件内容是否不同(然后简单地对文件进行散列),还是想检查实际的XML结构是否发生了变化(因此,将元素的顺序交换到元素可能不会导致差异)。这是哪一个?在我的应用程序中,它使用“XML哈希”,我(使用一个流)在DOM上以一个定义良好的顺序进行哈希-也就是说,我按字母顺序对元素进行排序,并首先降低深度,对于每个元素,我按字母顺序对值进行排序。我认为第一个选择是,如果两个文件是相同的。第二个很好,但我认为它太复杂了,在我的例子中没有必要。注意,两个不同的对象可以有相同的哈希代码,这不是很不可能吗?或者是因为更改可能很小?我可以从中解读出不同的问题:您是想检查文件内容是否不同(然后简单地散列文件),还是想检查实际的XML结构是否发生了更改(因此,将元素的顺序交换到元素可能不会导致差异)。这是哪一个?在我的应用程序中,它使用“XML哈希”,我(使用一个流)在DOM上以一个定义良好的顺序进行哈希-也就是说,我按字母顺序对元素进行排序,并首先降低深度,对于每个元素,我按字母顺序对值进行排序。我认为第一个选择是,如果两个文件是相同的。第二个很好,但我认为它太复杂了,在我的例子中没有必要。注意,两个不同的对象可以有相同的哈希代码,这不是很不可能吗?还是因为变化可能很小?