通过选择特定标记名称进行比较来比较xml文件,列出该特定标记的属性差异

时间:2017-01-18 15:00:54

标签: java xml xmlunit-2

考虑:

<ParentTag>
    <Firstchild ID="id1" Title="title1">
        <secondchild ID="" Title="">
            <TagOfInterest ID="value1" Title=""/>
            <TagOfInterest ID="value2" Title=""/>
            <TagOfInterest ID="value3" Title=""/>
        </secondchild>
    </Firstchild>
</ParentTag>

<secondxml>
    <something ID="id1" Title="title1">
        <anotherthing ID="" Title="">
            <TagOfInterest ID="value1" Title=""/>
            <TagOfInterest ID="dinosaur" Title=""/>
            <TagOfInterest ID="nomore" Title=""/>
        </anotherthing>
    </something>
</secondxml>

我正在使用XML Unit,

要求1:比较引擎应比较标签名称&#34; tagofInterest&#34;。

要求2:如果存在差异,则在该标记内,按属性进行比较。

仅打印标签名称的实施,但没有对感兴趣的标签或其内的属性进行大量控制。使用XML Unit的方式有什么更好的建议吗?

        fr1 = new FileReader(expectedXML);
        fr2 = new FileReader(actualXML);
        Diff diff = new Diff(fr1, fr2);
        DetailedDiff detDiff = new DetailedDiff(diff);
        detDiff.overrideMatchTracker(new MatchTrackerImpl());
        detDiff.overrideElementQualifier(new ElementNameQualifier());
        detDiff.getAllDifferences();




class MatchTrackerImpl implements MatchTracker {
  public void matchFound(Difference difference) {
    if (difference != null) {
        NodeDetail controlNode = difference.getControlNodeDetail();
        NodeDetail testNode = difference.getTestNodeDetail();
        System.out.println(printNode(controlNode.getNode()));
        System.out.println(printNode(testNode.getNode()));
    }
}

private static String printNode(Node node) {
    if (node != null && node.getNodeType() == Node.ELEMENT_NODE) {
        StringWriter sw = new StringWriter();
        try {
            Transformer t = TransformerFactory.newInstance().newTransformer();
            t.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes");
            t.transform(new DOMSource(node), new StreamResult(sw));
        } catch (TransformerException te) {
            System.out.println("nodeToString Transformer Exception");
        }
        return sw.toString();

     }
    return null;
 }
}

1 个答案:

答案 0 :(得分:0)

从您的示例中我了解到“tagofInterest”显示为forrest的一部分,而不是文档中的单个元素树。否则,您可以使用XMLUnit 2.x并仅将DifferenceEngine应用于感兴趣的Element

XMLUnit中没有内置方法,您必须提供自己的XMLUnit扩展点之一的实现。

您正在寻找的界面是XMLUnit 1.x中的DifferenceListener和2.x中的DifferenceEvaluator。那些负责确定是否应报告发动机检测到的差异(如果是,则报告的严重程度)。

您可以提供自己的实现,降低为未命名为“tagofInterest”的节点检测到的所有差异。如果您对“tagofInterest”的孩子感兴趣,它可能会变得有点复杂,因为您需要前往查看是否存在“tagofInterest”父母。