XMLUnit 比较和存储与发现的差异相关的特定值
XMLUnit Comparing and Storing Specific Values Related to a Found Difference
我正在尝试比较两个 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,但有没有办法实际获取该 associateID,即使这不是该节点上的实际差异。
我们有多个关联文件,因此我希望能够将找到的差异映射到必要的 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 引擎(给定您的节点匹配器,ID 应该相同)。 XMLUnit 的 XPath API 可以简化这个。
使用 DOM 的方法是相似的,你会从 Comparison
s target
Node
向上走,直到你到达一个名为 [=10 的元素=].
我正在尝试比较两个 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,但有没有办法实际获取该 associateID,即使这不是该节点上的实际差异。
我们有多个关联文件,因此我希望能够将找到的差异映射到必要的 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 引擎(给定您的节点匹配器,ID 应该相同)。 XMLUnit 的 XPath API 可以简化这个。
使用 DOM 的方法是相似的,你会从 Comparison
s target
Node
向上走,直到你到达一个名为 [=10 的元素=].