我在 Flex/AS3 中工作(为简单起见)一个 XML 编辑器。我需要提供撤消/重做功能。
当然,一种解决方案是在每次编辑时存储整个源文本。但是,为了节省内存,我想存储差异(这些差异也将用于将更新传输到服务器以进行自动保存)。
我的问题是 - 我可以使用纯文本差异算法来跟踪这些 XML 更改吗?
我在互联网上的研究表明我不能这样做。但是,我显然错过了一些东西。明文 diff 提供的功能据称是:
diff(text, text') -> diffs
patch(text, diffs) -> text'
XML 只是文本,那么为什么我不能只使用 diff() 和 patch() 来可靠地转换文本呢?
例如:假设我是一个诗人。当我写诗时,我会使用很多时髦的标点符号……你知道,像 <、/ 和 >。(您可能会看到我将如何处理...)如果我在使用差异来提供撤消/重做功能的应用程序中写诗,那么当我撤消/重做我的编辑时,我的诗歌会变得乱码吗?这只是文字!为什么它会对算法产生影响?
我显然在这里没有得到任何东西......感谢您的解释!:)
更新:
我遇到的一些关于使用纯文本算法区分 XML 的讨论:
- http://code.google.com/p/google-diff-match-patch/wiki/Plaintext
- 是否有一个针对 htmlstring 的 JS diff 库,就像纯文本上的 google-diff-match-patch 一样?
另外,我知道命令模式可能是实现撤消/重做的更好方法。为了简单起见,我已经简化了我的用例,我仍然认为 XML diffing 是最好的方法。