2013-03-27 67 views
0

是否有一些干净的方法知道DOM文档的某些内容何时被修改,而不必递归到其节点并散列大量数据?Java:如何知道XML文档何时被修改

我会避免生成完整的XML字符串(见@AdriaanKoster的回应)

使用监听器或任何‘聪明’,因为@mthmulders指出了这一点,似乎是正确的方式。

我发现了一个有趣的SO帖子here,也许是答案?

任何提示?

感谢

回答

1

你可以检查您是否Document也就是EventTarget一个实例。如果是这样,您可以使用addEventListener方法来处理任何事件。例如,如果正在处理的事件是MutationEvent,您可能会收到有关文档修改的信息。

+0

谢谢,但我无法找出相关的例子。你有一些吗? – Benj 2013-03-27 09:07:06

+0

不,我没有。我会去试错。 – mthmulders 2013-03-27 09:14:10

+0

我发现:http://stackoverflow.com/questions/2487492/javadom-registering-and-using-modification-listeners-tutorials但我不知道它是否会对* full *树有影响。 – Benj 2013-03-27 09:18:35

1

我这样做了一次,即将文档序列化为字符串并取其哈希码。我认为这不是一个非常昂贵的操作。它是这样的:

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异常的情况,因为我不想负担异常处理调用代码而确定的哈希码。这意味着无法成功转换的文档更改将无法正确检测。

+0

哎呀我没有写“没有生成全文”。我修好了它。感谢您的回答,因为它符合问题。 +1 – Benj 2013-03-27 11:01:54

+0

好主意。采用'hashCode'并不是特别昂贵,我同意。但是如何将DOM树写入'String'?无论是哪种情况,当事件监听推动事件时(无论您是否检查它们,您总是会收到变更通知),此解决方案正在为更改(当您怀疑发生更改时您必须执行此操作)进行更改。不过,实施可能会更简单。 – mthmulders 2013-03-27 11:06:21

+0

我想这取决于用例。如果您的代码始终有内存中的文档,您可以监听更改事件。但是,如果你偶尔从远程源文件中提取它并想检查它是否发生了变化,那么你不能这么做,并且必须使用某种哈希方法。 – 2013-03-27 11:26:14