忽略特定节点的特定属性,而使用XMLUnit 2.X

问题描述:

比较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的新手,请相应地提供帮助。

在此先感谢。

如果您真的想要,您可以使用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)的概念。 –