使用XMLUnit查找缺少的元素

时间:2012-04-26 15:20:38

标签: recursion xmlunit


我有以下testXML

<root>
   <a>test</a>
   <b>bee</b>
   <d/>
</root>

虽然templateXML看起来像这样

<root>
  <a/>
  <b/>
  <c/>
  <d>
    <e/>
  </d>
</root>

我希望XMLUnit返回缺少的元素,在这种情况下'c'和'e'缺失

/ root [1] / c [1]丢失了 / root [1] / d [1] / e [1]缺失

我的代码看起来像这样

public static ArrayList<Difference> testCompareToSkeletonXML(String xml, String template) throws Exception {

    XMLUnit.setCompareUnmatched(false);
    XMLUnit.setIgnoreAttributeOrder(true);
    XMLUnit.setIgnoreComments(true);
    XMLUnit.setIgnoreWhitespace(true);
    XMLUnit.setIgnoreDiffBetweenTextAndCDATA(true);     

    DifferenceListener myDifferenceListener = new IgnoreTextAndAttributeValuesDifferenceListener();
    DetailedDiff myDiff = new DetailedDiff(new Diff(template, xml));
   // myDiff.overrideDifferenceListener(myDifferenceListener);
    myDiff.overrideElementQualifier(new RecursiveElementNameAndTextQualifier());
    ArrayList<Difference> returnList = new ArrayList<Difference>();
    List<Object> allDifferences = myDiff.getAllDifferences();
    for(Object obj: allDifferences){
        Difference dif = (Difference) obj;          
        if(dif.getTestNodeDetail().getNode()== null){
            //returnList.add(dif);          
            System.out.println(dif.getControlNodeDetail().getXpathLocation());
        }   
    }
    return returnList;
}

生成的输出如下所示

/ root [1] / a [1]
/ root [1] / b [1]
/ root [1] / c [1]
/ root [1] / d [1]

感谢您的帮助 --SD

1 个答案:

答案 0 :(得分:2)

如果元素名称和嵌套文本相同,则告诉XMLUnit仅匹配元素。对于您的ab元素(它们在嵌套文本中有所不同),情况并非如此,这就是您在列表中看到它们的原因。

根据d的规则,您看到e而不是嵌套d,因为顶级RecursiveElementNameAndTextQualifier不同。如果您删除了行设置,则RecursiveElementNameAndTextQualifier列表会缩小为

/root[1]/c[1]
/root[1]/d[1]/e[1]

这是你所期待的。