Java:如何知道XML文档何时被修改
是否有一些干净的方法知道DOM文档的某些内容何时被修改,而不必递归到其节点并散列大量数据?Java:如何知道XML文档何时被修改
我会避免生成完整的XML字符串(见@AdriaanKoster的回应)
使用监听器或任何‘聪明’,因为@mthmulders指出了这一点,似乎是正确的方式。
我发现了一个有趣的SO帖子here,也许是答案?
任何提示?
感谢
你可以检查您是否Document
也就是EventTarget
一个实例。如果是这样,您可以使用addEventListener
方法来处理任何事件。例如,如果正在处理的事件是MutationEvent
,您可能会收到有关文档修改的信息。
我这样做了一次,即将文档序列化为字符串并取其哈希码。我认为这不是一个非常昂贵的操作。它是这样的:
private int calculateHashCode(org.w3c.dom.Document document) {
try {
DOMSource source = new DOMSource(document);
StringWriter writer = new StringWriter();
StreamResult result = new StreamResult(stringWriter);
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
transformer.setOutputProperty("indent","no");
transformer.transform(domSource, result);
return stringWriter.toString().hashCode();
}
catch(TransformerException e) {
return -1;
}
}
我返回-1异常的情况,因为我不想负担异常处理调用代码而确定的哈希码。这意味着无法成功转换的文档更改将无法正确检测。
哎呀我没有写“没有生成全文”。我修好了它。感谢您的回答,因为它符合问题。 +1 – Benj 2013-03-27 11:01:54
好主意。采用'hashCode'并不是特别昂贵,我同意。但是如何将DOM树写入'String'?无论是哪种情况,当事件监听推动事件时(无论您是否检查它们,您总是会收到变更通知),此解决方案正在为更改(当您怀疑发生更改时您必须执行此操作)进行更改。不过,实施可能会更简单。 – mthmulders 2013-03-27 11:06:21
我想这取决于用例。如果您的代码始终有内存中的文档,您可以监听更改事件。但是,如果你偶尔从远程源文件中提取它并想检查它是否发生了变化,那么你不能这么做,并且必须使用某种哈希方法。 – 2013-03-27 11:26:14
谢谢,但我无法找出相关的例子。你有一些吗? – Benj 2013-03-27 09:07:06
不,我没有。我会去试错。 – mthmulders 2013-03-27 09:14:10
我发现:http://stackoverflow.com/questions/2487492/javadom-registering-and-using-modification-listeners-tutorials但我不知道它是否会对* full *树有影响。 – Benj 2013-03-27 09:18:35