包含不匹配的名称属性的 XMLUnit 标记

XMLUnit tag containing name attribute not matching

我正在使用 xmlunit 2.5.0.

下面是我的两个 xml 字符串:一个是 controlxml 一个是 testxml.

String controlXml = "<flowers><flower><f1 name = \"Roses\"/></flower><flower><f1 name = \"Daisy\"/></flower><flower><f1 name = \"Crocus\"/></flower></flowers>";

String testXml = "<flowers><flower><f1 name = \"Daisy\"/></flower><flower><f1 name = \"Roses\"/></flower><flower><f1 name = \"Crocus\"/></flower></flowers>";

这里我比较这两个字符串 xmls 使用 xmlunit。

我的java代码是:

org.xmlunit.diff.Diff myDiff = DiffBuilder.compare(controlXml).withTest(testXml)
                    .checkForSimilar() 
                    .withNodeMatcher(new 
                     DefaultNodeMatcher(ElementSelectors.conditionalBuilder()
                               .whenElementIsNamed("f1")
                               .thenUse(ElementSelectors.byName)
                               .elseUse(ElementSelectors.byNameAndText)
                               .build()))
                    .build();

获取错误:

***********************
Expected attribute value 'Roses' but was 'Daisy' - comparing <f1 name="Roses"...> at /flowers[1]/flower[1]/f1[1]/@name to <f1 name="Daisy"...> at /flowers[1]/flower[1]/f1[1]/@name (DIFFERENT)
***********************
***********************
Expected attribute value 'Daisy' but was 'Roses' - comparing <f1 name="Daisy"...> at /flowers[1]/flower[2]/f1[1]/@name to <f1 name="Roses"...> at /flowers[1]/flower[2]/f1[1]/@name (DIFFERENT)
***********************

我不想出错,因为 Rose 出现在测试中xml。为什么 Rose in controlxml 与 Daisy in testxml 相比,即使我在 testxml 中上升了并且我有 ElementSelectors.byNamewhenElementIsNamed("f1")

我应该使用哪个 ElementSelector?

你的

.whenElementIsNamed("f1")
.thenUse(ElementSelectors.byName)

表示您的 "f1" 元素将按文档顺序进行比较。毕竟他们都有相同的名字。您显然感觉到 name 属性的值是标识要比较的 "f1" 的值。如果 "f1" 是兄弟姐妹,那么一个简单的

.thenUse(ElementSelectors.byNameAndAttributes("name"))

应该可以。 byNameAndAttributes 采用可变参数列表,其中的属性值必须与元素名称相匹配。

不幸的是,它们不是兄弟姐妹,您必须告诉 XMLUnit 在遍历树时选择哪个 "flower" 元素。当 XMLUnit 选择错误的 "flower"s 时,它永远不会看到您认为相同的 "f1"。

您的示例的完整解决方案是

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder()
    .whenElementIsNamed("flower")
    .thenUse(ElementSelectors.byXPath("./f1", ElementSelectors.byNameAndAttributes("name")))
    .elseUse(ElementSelectors.byNameAndText)
    .build()))