ノードに再帰して大量のデータをハッシュすることなく、DOMドキュメントの一部のコンテンツがいつ変更されたかを知るためのクリーンな方法はありますか?
完全なXML文字列を生成することは避けます(@AdriaanKosterの応答を参照)
@mthmuldersが指摘したように、リスナーまたは「賢い」ものを使用するのは正しい方法のようです。
私はここで面白いSO投稿を見つけました、多分それは答えですか?
ヒントはありますか?
ありがとう
自分Document
ものインスタンスであるかどうかを確認できますEventTarget
。その場合は、このaddEventListener
メソッドを使用して任意のイベントを処理できます。たとえば、処理されているイベントがである場合MutationEvent
、ドキュメントへの変更に関する情報を取得できます。
ドキュメントを文字列にシリアル化し、そのハッシュコードを取得することで、これを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;
}
}
hashCodeを決定する際に例外処理で呼び出し元のコードに負担をかけたくないため、例外の場合は-1を返します。これは、正常に変換できないドキュメントの変更が正しく検出されないことを意味します。