Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以使用纯文本差异算法来跟踪XML更改吗?_Xml_Algorithm_Diff_Lcs - Fatal编程技术网

我可以使用纯文本差异算法来跟踪XML更改吗?

我可以使用纯文本差异算法来跟踪XML更改吗?,xml,algorithm,diff,lcs,Xml,Algorithm,Diff,Lcs,为了简单起见,我正在使用Flex/AS3开发一个XML编辑器。我需要提供撤销/重做功能 当然,一种解决方案是在每次编辑时存储整个源文本。但是,为了节省内存,我想存储diff(这些diff还将用于将更新传输到服务器以自动保存) 我的问题是-我可以使用纯文本差异算法来跟踪这些XML更改吗? 我在互联网上的研究表明我不能这样做。然而,我显然遗漏了一些东西。纯文本差异提供的功能据称是: diff(text, text') -> diffs patch(text, diffs) -> tex

为了简单起见,我正在使用Flex/AS3开发一个XML编辑器。我需要提供撤销/重做功能

当然,一种解决方案是在每次编辑时存储整个源文本。但是,为了节省内存,我想存储diff(这些diff还将用于将更新传输到服务器以自动保存)


我的问题是-我可以使用纯文本差异算法来跟踪这些XML更改吗?

我在互联网上的研究表明我不能这样做。然而,我显然遗漏了一些东西。纯文本差异提供的功能据称是:

diff(text, text') -> diffs
patch(text, diffs) -> text'
XML只是文本,为什么我不能使用diff()和patch()可靠地转换文本呢

比如说,我是一位诗人。当我写诗时,我用了很多时髦的标点符号。。。你知道,就像。(你可能会看到我要做什么…)如果我在一个使用diff提供撤销/重做功能的应用程序中写诗,当我撤销/重做编辑时,我的诗是否会变得乱七八糟?只是文字!为什么它会对算法产生影响

很明显,我这里没有什么东西……谢谢你的解释!:)

更新:

我遇到过一些关于使用明文算法区分XML的讨论:



另外,我知道命令模式可能是实现撤销/重做的更好方法。为了简单起见,我简化了我的用例,我仍然认为XML差异化是最好的方法。

我认为您可以将文本差异用于XML,特别是在您的情况下,人类将逐行编写XML。我不知道你得到了什么信息,说你不能这样做,但我猜这句话是基于这样一个事实,即空格字符(空格、制表符、换行符…)与纯文本文件中的字符有些不同,这可能导致从XML角度看,两个不同的文本文件是相同的。但是,对于一个以人类为目标的编辑器来说,我不明白为什么你不能。

我一直在比较XML文档。它在一定程度上理解XML

您可能需要对这两个文档进行预处理,以便进行文本比较,从而尽可能做到最好。例如,在一些XML文档中,某些元素的顺序可能并不重要。这对您的diff工具肯定很重要!在比较两个已排序的文件之前,您可能需要使用XML转换对XML进行预处理,该转换将这些元素按公共顺序在两个文件中进行排序

您还需要对两个文档使用相同的缩进。我发现在新行上开始每个元素,并对每个级别使用相同数量的缩进(带空格)是很有用的。如果您的文档变得非常深入,您可能希望每个级别只使用一到两个空格,以便比较适合屏幕。您甚至可能希望每行使用一个属性(并将属性按公共顺序排序)。

如果您是撤消/重做点之间数据的唯一“所有者”,那么当然可以使用纯文本差异。正如您所指出的,它相当于一组转换

但是,根据您提供的操作,明文差异可能远不是记录撤消/重做的最佳选择,您可能需要专门处理某些情况。想象一下,只记录一个ReplaceAll命令,它可能只需要几个字节的开销加上搜索和替换字符串。这可能会产生大量的明文差异

在更广泛的上下文中,如果您允许对这些文档进行外部编辑,并且您更多地考虑如何在服务器上存储增量,那么您就是在模仿git或其他版本控制系统。您必须使用某种diff算法,因为记录命令显然不是转换的唯一来源。此时,您开始将撤销/重做与版本控制相结合,您可能需要认真考虑如何让用户混淆这些概念

我会将撤销/重做保持在编辑会话中,并在文件打开时禁止外部编辑。正如我上面所说的那样,这使您能够针对广泛的情况优化您的命令记录


除此之外,可以使用传统的版本控制(考虑包装git),也可以实现自己的方式来处理在编辑器之外更改的文件。

我是Google纯文本diff/match/patch库的作者

关键问题是你的补丁是否准确。在理想世界中:

  diff(old_text, new_text) -> edits
  patch(edits, old_text) -> new_text
请注意,两个操作中的基本文本(旧文本)是相同的。在这种理想情况下,一个简单的纯文本diff和补丁将完美地工作,而不管内容的类型如何。如果这个案子适用于你,那么你就完蛋了

问题在于模糊修补。下面是相应的示例:

  diff(old_text, new_text) -> edits
  patch(edits, old_forked_text) -> new_forked_text
请注意,两种操作中的基础文本不相同。它们应该是相似的,但是补丁操作现在必须对它应该做什么进行“判断”。某些修补程序可能完全适合编辑中指定的修补程序,其他修补程序可能需要调整位置,其他修补程序可能需要调整更改的上下文,其他修补程序可能根本不适合,应该删除。如果您的修补算法在做出决定时不知道XML的结构,那么您很可能最终会得到错误的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>
old_text=JabberwockHelloWorld
new_text=JabberwockHelloWorld
差异(旧文本、新文本)->编辑
编辑=[“SPAN”->“DIV”@字符11,
“SPAN”->“DIV”@字符41]
old_forked_text=HelloWorld
修补程序(编辑,旧的\u分叉\u文本)->新的\u分叉\u文本
new\u forked\u text=HelloWorld
让我们仔细看看这个。原始的diff返回了两个编辑,将最外层的SPAN更改为DIV。简单更改。不幸的是,此编辑应用到的文本与原始文本不同。“Jabberwock”一词已被删除。现在是冷杉