[英]How do I map/ignore certain tag when comparing XML?
我正在比較使用XMLUnit 2.xx的2個XML,除了根節點名稱,它們都具有相同的結構:
<expectedValue>
<elementA>something</elementA>
<elementB>something else</elementB>
<elementC>yet another thing</elementC>
</expectedValue>
<value>
<elementA>something</elementA>
<elementB>something else</elementB>
<elementC>yet another thing</elementC>
</value>
我正在尋找一種對diffBuilder說的ExpectedValue expectedValue == value
或最終只是忽略此特定比較的方法。
任何想法 ? 謝謝
這大大扭曲了XML中的平等思想:-)
你需要做兩件事情,首先你需要提供一個ElementSelector
你自己,告訴XMLUnit測試,甚至比較expectedValue
和value
節點。 在第二部分中,您需要一個DifferenceEvaluator
,它說節點名稱的差異很好。
就像是
public static void main(String[] args) {
String x1 = "<expectedValue>"
+ " <elementA>something</elementA>"
+ " <elementB>something else</elementB>"
+ " <elementC>yet another thing</elementC>"
+ "</expectedValue>";
String x2 = "<value>"
+ " <elementA>something</elementA>"
+ " <elementB>something else</elementB>"
+ " <elementC>yet another thing</elementC>"
+ "</value>";
NodeMatcher m = new DefaultNodeMatcher(ElementSelectors.or((e1, e2) -> {
if (e1 == null || e2 == null) {
return false;
}
return "expectedValue".equals(e1.getLocalName())
&& "value".equals(e2.getLocalName());
}), ElementSelectors.byName);
Diff d = DiffBuilder.compare(x1)
.withTest(x2)
.withNodeMatcher(m)
.withDifferenceEvaluator(DifferenceEvaluators
.downgradeDifferencesToEqual(ComparisonType.ELEMENT_TAG_NAME))
.build();
System.err.println(d);
}
將為簡單的情況做。
我找到了一種忽略2個特定標簽名稱的特定比較的方法。
如果有人需要,我會在這里給出答案
首先創建一個自定義的DifferenceEvaluator:
public class IgnoreTagNameDifferenceEvaluator implements DifferenceEvaluator {
Map<String,String> map;
public IgnoreTagNameDifferenceEvaluator(Map<String,String> map){
this.map = map;
}
@Override
public ComparisonResult evaluate(Comparison comparison, ComparisonResult outcome) {
if (outcome == ComparisonResult.EQUAL) return outcome; // only evaluate differences.
if(comparison.getType() == ComparisonType.ELEMENT_TAG_NAME){
String value = map.get(comparison.getControlDetails().getValue());
if(value != null && value.equals(comparison.getTestDetails().getValue())){
return ComparisonResult.SIMILAR;
}
}
return outcome;
}
}
然后像這樣將其鏈接到diffBuilder:
diffBuilder = diffBuilder.withDifferenceEvaluator(DifferenceEvaluators.chain(
DifferenceEvaluators.Default, new IgnoreTagNameDifferenceEvaluator(tagMap)));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.