Recursion 使用XMLUnit查找缺少的元素

Recursion 使用XMLUnit查找缺少的元素,recursion,xmlunit,Recursion,Xmlunit,我有以下testXML <root> <a>test</a> <b>bee</b> <d/> </root> 测试 蜜蜂 而templateXML看起来是这样的 <root> <a/> <b/> <c/> <d> <e/> </d> </root> public s


我有以下testXML

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

测试
蜜蜂
而templateXML看起来是这样的

<root>
  <a/>
  <b/>
  <c/>
  <d>
    <e/>
  </d>
</root>
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;
}

我希望XMLUnit返回缺少的元素,在本例中,缺少“c”和“e”

/缺少根目录[1]/c[1]
/缺少根目录[1]/d[1]/e[1]

我的代码如下所示

<root>
  <a/>
  <b/>
  <c/>
  <d>
    <e/>
  </d>
</root>
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;
}
公共静态ArrayList testCompareToSkeletonXML(字符串xml,字符串模板)引发异常{
setCompareUnmatched(false);
setIgnoreAttributeOrder(true);
XMLUnit.setIgnoreComments(true);
setIgnoreWhitespace(true);
setIgnoreDiffBetweenTextAndCDATA(true);
DifferenceListener myDifferenceListener=新的IgnoreTextandAttribute值DifferenceListener();
DetailedDiff myDiff=新的DetailedDiff(新的差异(模板,xml));
//myDiff.overrideDifferenceListener(myDifferenceListener);
myDiff.overrideElementQualifier(新的RecursiveElementNameAndTextQualifier());
ArrayList returnList=新建ArrayList();
List allDifferences=myDiff.getAllDifferences();
对于(对象对象对象:所有差异){
差异dif=(差异)obj;
if(dif.getTestNodeDetail().getNode()==null){
//返回列表。添加(dif);
System.out.println(dif.getControlNodeDetail().getXpathLocation());
}   
}
退货清单;
}
生成的输出如下所示

<root>
  <a/>
  <b/>
  <c/>
  <d>
    <e/>
  </d>
</root>
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;
}
/根目录[1]/a[1]
/根目录[1]/b[1]
/根目录[1]/c[1]
/根目录[1]/d[1]

谢谢你的帮助

--SD

您告诉XMLUnit仅当元素名称和嵌套文本相同时才相互匹配元素。对于
a
b
元素(它们在嵌套文本中不同),情况并非如此,这就是为什么您会在列表中看到它们

您看到的是
d
而不是嵌套的
e
,因为顶级
d
s根据
递归元素名称和文本限定符的规则不同。如果删除行设置,则递归元素名称和文本限定符将减少到

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

这正是您所期望的。

问题是,我希望XMLUnit返回缺少的元素,在本例中,缺少“c”和“e”/缺少根[1]/c[1]/缺少根[1]/d[1]/e[1]