如何比较两个XML-s的相似性?



我有一个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)))

这似乎忽略了<Result>中元素的顺序,但没有忽略<Result>元素本身的顺序。

如何实现相似性检查?

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

最新更新