#xml #xml-document #diff #difference #diffing #human-readable #natural

yanked natural-xml-diff

XML文档之间的自然差异

2 个不稳定发布

0.2.0 2023年1月3日
0.1.0 2022年12月19日

#15 in #diffing

MIT 许可证

140KB
3K SLoC

natural-xml-diff

Crates.io Documentation

natural-xml-diff 包实现了一种差异算法,旨在在两个XML文档之间生成正确且可读的差异。

API 文档

算法

该库实现的算法基于论文"在XML中跟踪和检测变化的桥梁"。它还由基于Java的jndiff库实现。

正在进行中

这仍然是一个正在进行中的项目!

致谢

Paligo

结构化差异

让我们考虑以下XML文档,摘自“桥梁”论文

<?xml version="1.0"?>
<book>
  <chapter>
    <title>Text 1</title>
    <para>Text 2</para>
  </chapter>
  <chapter>
    <title>Text 4</title>
    <para>Text 5</para>
  </chapter>
  <chapter>
    <title>Text 6</title>
    <para>Text 7<img/>Text 8</para>
  </chapter>
  <chapter>
    <title>Text 9</title>
    <para>Text 10</para>
  </chapter>
  <chapter>
    <para>Text 11</para>
    <para>Text 12</para>
  </chapter>
</book>

我们将称之为“文档A”,差异的“之前”。以下是“之后”,“文档B”

<?xml version="1.0"?>
<book>
  <chapter>
    <para>Text 2</para>
  </chapter>
  <chapter>
    <title>Text 4</title>
    <para>Text 25</para>
    <para>Text 11</para>
  </chapter>
  <chapter>
    <title>Text 6</title>
    <para>Text 7<img/>Text 8</para>
  </chapter>
  <chapter>
    <title>Text 9</title>
    <para>Text 10</para>
  </chapter>
  <chapter>
    <para>Text 12</para>
  </chapter>
</book>

让我们将两者都表示为带编号节点的树(根节点,0,未显示)。以下是文档A

graph TD;
    1[1 book]-->2
	  2[2 chapter]-->3
	  2-->5
	  3[3 title]-->4
	  4[4 Text 1]
	  5[5 para]-->6
	  6[6 Text 2]
	  1-->7
	  7[7 chapter] --> 8
	  8[8 title] --> 9
	  9[9 Text 4]
	  7 --> 10
	  10[10 para] --> 11
	  11[11 Text 5]
	  1 --> 12
	  12[12 chapter] --> 13
	  13[13 title] --> 14
	  14[14 Text 6]
	  12-->15
	  15[15 para] --> 16
	  15 --> 17
	  15 --> 18
	  16[16 Text 7]
	  17[18 img]
	  18[19 Text 8]
	  1 --> 19
	  19[19 chapter]
	  19 --> 20
	  20[20 title] --> 21
	  21[21 Text 9]
	  19 --> 22
	  22[22 para] --> 23
	  23[23 Text 10]
	  1 --> 24
	  24[24 chapter] --> 25
	  25[25 para] --> 26
	  26[26 Text 11]
	  24 --> 27
	  27[27 para] --> 28
	  28[28 Text 12]

维护测试

一些测试使用test_generatortestdata目录生成测试。但是,该目录中的新测试不会自动获取;您必须强制重新编译运行测试的.rs文件以实现此目的。您可以通过在包含test_generator的每个.rs文件中进行非显著空白编辑并保存来实现。我希望有一个更好的解决方案。

依赖关系

~4MB
~73K SLoC