我正在Flex/AS3上(为简单起见)XML编辑器。我需要提供撤销/恢复功能。

当然,一个解决方案是储存的整个来源的文字与每个编辑。但是,节省的存储器,我想存在差异,而不是(这些差异也将被用来传递更新的服务器自动节).


我的问题是-我可以用纯文本的差异算法用于跟踪这些变化的XML?

我的研究在互联网上表示我 不能 这样做。然而,我明显地缺少的东西。明文差异提供的功能是据称:

diff(text, text') -> diffs
patch(text, diffs) -> text'

XML是简单的文字,那么,为什么我不能只是采用差异()并贴()改变该文本的可靠?

例如:让我们说,我是一个诗人。当我写诗,我用很多时髦的标点符号...你知道的,就像 <、/和>.(你可能会看到我要和这个...)如果我在写诗歌的应用程序中使用差异以提供消除/重新功能,我的诗歌变成混乱的时候我撤消或重做我的编辑?这只是文字!为什么让一个差异算法?

我显然没有得到一些东西在这里...谢谢你解释!:)

更新:

一些讨论,我遇到了关于比较XML有明文的算法:


此外,我的理解是,一模式的命令是有可能一个更好的办法来实现消除/重做。我已经简化了我的使用情况为简便起见,我也仍然认为,XML比较是最好的办法。

有帮助吗?

解决方案

我是作者的纯文本的差异/匹配/片图书馆。

关键问题是,是否你的修补程序是准确的。在一个理想的世界:

  diff(old_text, new_text) -> edits
  patch(edits, old_text) -> new_text

注意到基础文本(old_text)是同在这两种操作。在这个理想的情况下,那么一个简单纯文本的差异和修补会的工作,无论是何种类型的内容。如果这种情况下适用于你,然后你做了。

问题在于模糊修补。这里的相对应例子:

  diff(old_text, new_text) -> edits
  patch(edits, old_forked_text) -> new_forked_text

注意到基本案文是不相同的操作。他们应该是相似的,但是修补操作现在已经使用"判决"是什么应该做的。有些修补程序可能完全适合作为指定的编辑,其他人可能需要调整位置,其他人可能需要调整为改变的方面,其他可能不配合,在所有的和应当删除。如果你修修补补的算法是不知道的结构XML时做出决定时,你很可能最终与malfromed XML。这里有一个样品:

  old_text = Jabberwock<SPAN>Hello<SPAN>World</SPAN></SPAN>
  new_text = Jabberwock<DIV>Hello<SPAN>World</SPAN></DIV>
  diff(old_text, new_text) -> edits
  edits = ["SPAN" -> "DIV" @ character 11,
           "SPAN" -> "DIV" @ character 41]
  old_forked_text = <SPAN>Hello<SPAN>World</SPAN></SPAN>
  patch(edits, old_forked_text) -> new_forked_text
  new_forked_text = <SPAN>Hello<DIV>World</SPAN></DIV>

让我们看看这个小心。原来的差异返回的两个编辑更改外跨越来一DIV。简单的改变。不幸的是,文本编辑正在应用于发生了变化,从原来的。单词"贝尔沃克"已被删除。现在第一次跨>DIV改变相匹配的第二跨标签,不是第一个。由于修补的算法是不知道的XML规则的结果在非法地嵌套的标签。

还有一些黑客这让你保证有效的XML当使用纯文本的修补,但它们导致某些损失的灵活性(对原有问题已经有一个链接到wiki网页我写了关于此)。最终的解决方案,修补XML当然是使用XML-知道差异和修补的算法。这些都是明显地更加复杂和昂贵的,但它们的存在。谷歌的名字Tancred Lindholm和塞巴斯蒂安Rönnau的伟大工作,他们已经做了在XML领域(特别是关于DocEng).

让我知道如果有什么我可以添加。

--尼尔*弗雷泽

其他提示

我用 超出比较 所有的时间比较XML文件。它理解XML,在一定的程度。

你可能需要预先处理的两个文件以文本比较来做的最好的工作成为可能。例如,在一些XML文件,以某些元素可能不重要。它肯定会问题比较的工具!你可能需要预先处理XML使用XML改变这种这些要素纳入一个共同的秩序,在这两个文件之前,比较两个排的文件。

你也要用同样的缩进这两个文件。我找到有用的启动每个元素的新的线,并使用同样数量的压痕,有的空间,为每个级别。如果你的文件得到非常深刻,你就要用唯一一个或两个空间%的水平,因此,比较适合在屏幕上。你甚至可能要使用一种属性,每线(以及排序的属性成一个共同的顺序)。

如果你是唯一的"所有者"之间的数据撤销/恢复点然后当然你可以用纯文本的差异。正如你指出的那样,它相当于一定的转变。

根据行动提供的,但是,明文比较可以不是远程接近最佳的记录消除/重复和可能需要专注某些情况下。想象一下只是记录ReplaceAll命令,这可能是只有几个字节的开销,加上检索和更换串。可能产生巨大的差异明文.

在更广泛的背景下,如果你允许外部编辑的这些文件,你在想更多关于如何储存增量的服务器上,你是模仿git或其他版本控制系统。你必须使用某种类型的差异算法,因为只要记录您的命令是明显不是的唯一来源的转变。在这一点上你开始对混合的消除/重新版本控制和您可能想要好好想想混淆这些概念对于用户使用。

我将撤消保留/恢复作为在编辑会议和禁止外部编辑,虽然该文件是开放的。这可以让你以优化您的命令记录为广泛的情况下,如我上面所说的.

除此之外,使用传统版本控制(考虑包git)或实施自己的方式应对文件正在改变的外部编辑器。

我认为你可以使用文字的差异xml尤其是在你的情况下的人会写xml行行。我不知道什么样的信息你得说你不能这样做,但我猜这项声明是依据的事实是,空间字(空间,tab,newline...)有所不同,他们是在一个纯文本文件,这可能导致在两个不同的文本文件是相同的自XML观点。但是,为编辑目标的人,我不明白为什么你不能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top