【问题标题】:How to compare 2 XML-s for similarity?如何比较 2 个 XML-s 的相似性?
【发布时间】:2021-08-12 09:51:39
【问题描述】:

我有一个 XML 格式

<Response>
    <Result>
       <Status>SUCCESS</Status>
       <Message>Some message 1</Message>
    </Result>
    <Result>
       <Status>FAIL</Status>
       <Message>Some message 2</Message>
    </Result>
</Response>

我需要比较一下

<Response>
    <Result>
       <Status>FAIL</Status>
       <Message>Some message 2</Message>
    </Result>
    <Result>
       <Status>SUCCESS</Status>
       <Message>Some message 1</Message>
    </Result>
</Response>

它们相似,但不相同。我尝试使用 XMLunit 来比较这些,但我不断收到你不相似的错误

我的代码:

assertThat(result, isSimilarTo(control).withNodeMatchers(new DefaultNodeMatcher(ElementsSelector.byName)))

这似乎忽略了&lt;Result&gt; 中的元素顺序,但并未忽略&lt;Result&gt; 元素本身的顺序。

如何实现相似性检查?

【问题讨论】:

标签: java xml testing


【解决方案1】:

如果您在代码中使用定义明确的 Response 类型,则可以使用评分来实施相似性检查。例如: 首先,反序列化 Response 对象中的 XML。如果成功,则定义 score=0。然后,比较结果的数量并将差值添加到分数中。然后,对于第一个对象中的每个 Result,找到第二个对象中最相似的那个 - 使用 Damerau-Levenshtein 算法的实现来比较每个字段,例如状态和消息,并将最小距离和 (dist(status1, status2) + dist(message1, message2)) 添加到分数。或者您可以仅将此算法用于消息而不是状态,如果这更有意义的话。最后 - 较低的分数意味着更相似。您可以测试并定义您的支点,在该支点之上的对象被认为不相似。

【讨论】:

  • 虽然它可能工作......它可能工作量太大,因为系统需要快速。我发现 XMLUtil 可以定义一个条件 ElementSelector。基本上,如果它满足元素响应,则它会按名称和文本检查消息元素。否则它将只使用名称。这工作得很好。
  • 是的,它很慢。另一方面,由于实体的无序性质,我想所有比较 XML 的东西都很慢。我将看看 XMLUtil,因为我自己也对类似的解决方案感兴趣。
  • stackoverflow.com/questions/55363758/… Stefans 的回答对我有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-16
  • 2012-12-26
相关资源
最近更新 更多