比较两个忽略元素顺序的 XML 字符串

2022-09-01 11:27:26

假设我有两个xml字符串

<test>
  <elem>a</elem>
  <elem>b</elem>
</test>

<test>
  <elem>b</elem>
  <elem>a</elem>
</test>

如何编写比较这两个字符串并忽略元素顺序的测试?

我希望测试尽可能短,没有10行XML解析等的地方。我正在寻找一个简单的断言或类似的东西。

我有这个(这不起作用)

   Diff diff = XMLUnit.compareXML(expectedString, actualString);   
   XMLAssert.assertXMLEqual("meh", diff, true);

答案 1

对于xmlunit 2.0(我一直在寻找这个),它现在已经完成了,通过使用DefaultNodeMatcher

Diff diff = Diffbuilder.compare(Input.fromFile(control))
   .withTest(Input.fromFile(test))
   .withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText))
   .build()

希望这有助于其他人谷歌搜索...


答案 2

XMLUnit 将执行所需的操作,但您必须指定元素限定符。如果未指定元素限定符,则只会比较同一位置的节点。

对于您的示例,您需要一个 ElementNameAndTextQualifer,如果存在与元素名称和其文本值匹配的节点,则认为该节点类似,如下所示:

Diff diff = new Diff(control, toTest);
// we don't care about ordering
diff.overrideElementQualifier(new ElementNameAndTextQualifier());
XMLAssert.assertXMLEqual(diff, true);

你可以在这里阅读更多关于它的信息:http://xmlunit.sourceforge.net/userguide/html/ar01s03.html#ElementQualifier


推荐