Ham*_*ami 2 xml groovy compare xmlunit xmlunit-2
我想在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())
Run Code Online (Sandbox Code Playgroud)
所以,正如你所看到的,我使用了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>
Run Code Online (Sandbox Code Playgroud)
我的问题是我无法保证ValueA是第一个而不是第二个
这是你可能想要的:使用 ByNameAndTextRecSelector
withNodeMatcher(new DefaultNodeMatcher(new ByNameAndTextRecSelector(),ElementSelectors.byName))
Run Code Online (Sandbox Code Playgroud)
单元测试:
@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())
}
Run Code Online (Sandbox Code Playgroud)
积分给@bodewig.来自这里的样品
更新:使用OP原始xml片段的更多groovified版本.
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()
Run Code Online (Sandbox Code Playgroud)