簡體   English   中英

比較XML時如何映射/忽略某些標簽?

[英]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測試,甚至比較expectedValuevalue節點。 在第二部分中,您需要一個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM