XMLUNIT比较和存储与发现的差异相关的特定值



我正在尝试比较两个XML文件,如果在两个特定项目之间找到差异,我想存储一个也属于该项目的键值。例如,假设我有以下两个XML文件:

文件1:

  <associate>
    <vendorCodes>TEST</vendorCodes>
    <vendorCodes>TEST</vendorCodes>
    <vendorCodes>TEST</vendorCodes>
    <associateId>12345</associateId>
    <regionCode>A</regionCode>
    <stateCode>B</stateCode>
    <agentCode>C</agentCode>
    <territoryCode>D</territoryCode>
    <legalName>
        <firstName>Zach </firstName>
        <middleName></middleName>
        <lastName>Benchley</lastName>
        <suffix>     </suffix>
    </legalName>
    <preferredName>
        <firstName>Zach</firstName>
        <middleName> </middleName>
        <lastName>Benchley</lastName>
        <suffix>     </suffix>
    </preferredName>
 </associate>

文件2:

  <associate>
    <vendorCodes>NOTATEST</vendorCodes>
    <vendorCodes>TEST</vendorCodes>
    <vendorCodes>TEST</vendorCodes>
    <associateId>12345</associateId>
    <regionCode>A</regionCode>
    <stateCode>B</stateCode>
    <agentCode>C</agentCode>
    <territoryCode>D</territoryCode>
    <legalName>
        <firstName>Zach </firstName>
        <middleName></middleName>
        <lastName>Benchley</lastName>
        <suffix>     </suffix>
    </legalName>
    <preferredName>
        <firstName>Zach</firstName>
        <middleName> </middleName>
        <lastName>Benchley</lastName>
        <suffix>     </suffix>
    </preferredName>
 </associate>

因此,在上面的示例中,差异将被抛出,因为第一个供应商不匹配。因此,我想做的是获得当前的供应商码的新值:notatest。我可以做到这一点。但是,我也想存储已更改的同事的合伙人。有没有办法与新值一起获取AssociateId 12345?我看到有一个parentxpath,但是是否有一种方法可以真正抓住该助理,即使这不是该节点上的实际区别。

我们有多个同伴的文件,因此我希望能够将发现的差异映射到必要的AssociateId。

目前,我能够比较基于关联ID的订单发送的文档并进行比较。我只需要能够抓住这个价值。这是我目前有的代码:

    ElementSelector nodeMatch = ElementSelectors.conditionalBuilder().whenElementIsNamed("associate").thenUse(new AssociateNodeMatcher()).elseUse(ElementSelectors.byName).build();
    Diff myDiff = DiffBuilder.compare(doc1).withTest(doc2).checkForSimilar().ignoreWhitespace().withNodeMatcher(new DefaultNodeMatcher(nodeMatch)).build();

那么这是我的AssociateNodeMatcher:

    public boolean canBeCompared(Element control, Element test) {
    String controlAssociateId = control.getElementsByTagName("associateId").item(0).getTextContent();
    String testAssociateId = test.getElementsByTagName("associateId").item(0).getTextContent();  
    if(controlAssociateId.compareTo(testAssociateId)==0){
        return true;
    }
    return false;
}

}

任何帮助都会很棒。

如果差异可以在任何地方,则您将被迫使用代码进行。我认为您可以为此使用XPATH或DOM。对于XPath,您将差异的XPATH缩短,直到它选择正确的associate,然后在associateId上拍打,然后在控件或测试文档上使用Java的XPath Engine(如果给定节点匹配器,ID应该是相同的(。Xmlunit的XPath API可以简化此。

使用DOM的方法相似,您将从Comparison S target Node走去,直到达到一个名为associate的元素。

最新更新