包含不匹配的名称属性的 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.byName
和 whenElementIsNamed("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()))
我正在使用 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.byName
和 whenElementIsNamed("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()))