0

我正在使用 xmlunit 2.5.0。

下面是我的两个 xml 字符串:一个是 the 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>";

在这里,我正在使用 xmlunit 比较这两个字符串 xml。

我的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 存在于 testxml 中。为什么将 controlxml 中的 Rose 与 testxml 中的 Daisy 进行比较,即使我在 testxml 中有玫瑰并且我有ElementSelectors.byNameand whenElementIsNamed("f1")

我应该使用哪个 ElementSelector?

4

1 回答 1

0

您的

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

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

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

应该管用。byNameAndAttributes除了元素名称之外,还接受其值必须匹配的属性的可变参数列表。

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

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

.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder()
    .whenElementIsNamed("flower")
    .thenUse(ElementSelectors.byXPath("./f1", ElementSelectors.byNameAndAttributes("name")))
    .elseUse(ElementSelectors.byNameAndText)
    .build()))
于 2017-11-01T10:21:37.540 回答