XMLUnit比较和存储与找到的差异相关的特定值

时间:2017-04-27 14:21:18

标签: xmlunit xmlunit-2

我正在尝试比较两个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>

因此,在上面的示例中,将抛出差异,因为第一个vendorCode不匹配。所以我想要做的是获取vendorCode的当前新值,即:NotATest。我能做到这一点很好。但是,我还想存储已更改的关联的associateID。有没有办法获取associateID 12345以及新值?我看到有一个ParentXPath,但有没有办法实际获取该assocID,即使这不是该节点上的实际差异。

我们有多个联系人的文件,所以我希望能够将发现的差异映射到必要的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;
}

}

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:0)

如果差异可能在任何地方,那么你将被迫使用代码。我认为你可以使用XPath或DOM。对于XPath,你可以删除差异的XPath,直到它在@NgModule({ imports: [...], declarations: [MyComp , ColorFlip ] }) 上选择正确的associate,并在控制或测试文档上使用Java的XPath引擎(给定节点匹配器时,id应该是相同的)。 XMLUnit的XPath API可以简化这一过程。

使用DOM的方法类似,您可以从associateId Comparison target向上走,直到找到名为{{1}的元素}}