2017-07-26 26 views
0

比較XML文件,我有兩個XML文件:忽略特定節點的特定屬性,而使用XMLUnit 2.X

<!------------------------File1---------------------------------> 
    <note id="ignoreThisAttribute_1"> 
     <to>Experts</to> 
     <from>Matrix</from> 
     <heading id="dontIgnoreThisAttribute_1">Reminder</heading> 
     <body>Help me with this problem</body> 
    </note> 
<!------------------------File2---------------------------------> 
    <note id="ignoreThisAttribute_2"> 
     <to>Experts</to> 
     <from>Matrix</from> 
     <heading id="dontIgnoreThisAttribute_2">Reminder</heading> 
     <body>Help me with this problem</body> 
    </note> 

我不得不忽視的屬性:節點的idnote而比較這兩個文件。

我使用DiffBuilder

Diff documentDiff = DiffBuilder.compare(srcFile).withTest(destFile).build() 

大多數的在線解決方案建議實施DifferenceEvaluator

嘗試過爲好,但忽略了與屬性ID的所有節點,而我想忽略從屬性特定的節點:

public class IgnoreAttributeDifferenceEvaluator implements DifferenceEvaluator { 
     private String attributeName; 
     public IgnoreAttributeDifferenceEvaluator(String attributeName) { 
      this.attributeName = attributeName; 
     } 

     @Override 
     public ComparisonResult evaluate(Comparison comparison, ComparisonResult outcome) { 
      if (outcome == ComparisonResult.EQUAL) 
       return outcome; 
      final Node controlNode = comparison.getControlDetails().getTarget(); 


      System.out.println(controlNode.getNodeName()); 
      if (controlNode instanceof Attr) { 
       Attr attr = (Attr) controlNode; 
       if (attr.getName().equals(attributeName)) { 
        return ComparisonResult.EQUAL; 
       } 
      } 
      return outcome; 
     } 
    } 

在我的測試類調用方法:

final Diff documentDiff = DiffBuilder.compare(src).withTest(dest) 
.withDifferenceEvaluator(new IgnoreAttributeDifferenceEvaluator("id")) 
.build(); 

有人可以建議我一種方式,我可以使用XMLUnit 2.x來實現這一點 XMLUnit的新手,請相應地提供幫助。

在此先感謝。

回答

1

如果您真的想要,您可以使用DifferenceEvaluator。您只需要測試Attr的「所有者元素」名稱的名稱以及該屬性本身的名稱。

但是XMLUnit 2.x提供了一個不同的解決方案:AttributeFilter。代碼將不會與您已有的DifferenceEvaluator有所不同,但您不會混淆擔憂。

class IgnoreNoteId implements Predicate<Attr> { 

    public boolean test(Attr attr) { 
     return !("note".equals(attr.getOwnerElement().getNodeName()) 
      && "id".equals(attr.getNodeName())); 
    } 
} 

,或者使用Java8時即使有一個lambda較短在withAttributeFilter

+0

非常感謝Stefan。這很有幫助。我使用「withAttributeFilter」。 猜猜我需要更新我的lamba(Java 8)的概念。 –