我想在groovy代码中比较我的Soap Response和xml文件忽略顺序:
这是我的代码:
import org.custommonkey.xmlunit.Stuff
import org.xmlunit.Stuff
//ExpectedString is my xml converted to text, same for ResponseString
Diff diff = DiffBuilder.compare(ExpectedString)
.withTest(ResponseString)
.ignoreComments()
.ignoreWhitespace()
.checkForSimilar()
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
.build();
assertFalse("XML similar " + diff.toString(), diff.hasDifferences())
所以,正如你所看到的,我使用了DefaultNodeMatcher,我使用的是XMLUnit2.0 ......没有结果(甚至没有忽略顺序或比较时出现异常错误)
有解决方案吗?解决这个问题
由于我迫切希望找到一个直接的,我可以对我的xml和我的肥皂反应进行排序,这样我可以有一个简单的差异吗?有没有办法按字母顺序逐行排序?如果是,怎么样?
谢谢你们!
更新:
这是我简化的XML结构
<body>
<stuff>
<miniStuff></miniStuff>
<miniStuff></miniStuff>
</stuff>
<Services>
<Service>
<tag1>ValueA</tag1>
<tag2>ValueAA</tag2>
</Service>
<Service>
<tag1>ValueB</tag1>
<tag2>ValueBB</tag2>
</Service>
</services>
</body>
我的问题是我不能保证ValueA是第一个而不是第二个
答案 0 :(得分:5)
以下是您可能要查找的内容:使用ByNameAndTextRecSelector
withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
单元测试:
@Test
public void testDiffOrder() {
final String control = """
<r>
<ser>
<t1>a</t1>
<t2>b</t2>
</ser>
<ser>
<t1>d</t1>
<t2>e</t2>
</ser>
</r>"""
final String test = """
<r>
<ser>
<t1>d</t1>
<t2>e</t2>
</ser>
<ser>
<t1>a</t1>
<t2>b</t2>
</ser>
</r>"""
Diff diff = DiffBuilder.compare(Input.fromString(control))
.withTest(Input.fromString(test))
.ignoreComments()
.ignoreWhitespace()
.checkForSimilar()
.withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
.build()
assertFalse("XML differ " + diff.toString(), diff.hasDifferences())
}
致@bodewig。 来自here
的示例 使用OP原始xml片段更新:更多版本化。
import org.xmlunit.builder.DiffBuilder
import org.xmlunit.builder.Input
import org.xmlunit.diff.ByNameAndTextRecSelector
import org.xmlunit.diff.DefaultNodeMatcher
import org.xmlunit.diff.ElementSelectors
def control = """<body>
<stuff>
<miniStuff />
<miniStuff />
</stuff>
<Services>
<Service>
<tag1>ValueB</tag1>
<tag2>ValueBB</tag2>
</Service>
<Service>
<tag1>ValueA</tag1>
<tag2>ValueAA</tag2>
</Service>
</Services>
</body>"""
def test = """<body>
<stuff>
<miniStuff />
<miniStuff />
</stuff>
<Services>
<Service>
<tag1>ValueA</tag1>
<tag2>ValueAA</tag2>
</Service>
<Service>
<tag1>ValueB</tag1>
<tag2>ValueBB</tag2>
</Service>
</Services>
</body>"""
def myDiff = DiffBuilder.compare(Input.fromString(control))
.withTest(Input.fromString(test))
.checkForSimilar()
.withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
.build()
println myDiff.toString()
println myDiff.hasDifferences()
assert !myDiff.hasDifferences()