我正在尝试比较两个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;
}
}
任何帮助都会很棒。
答案 0 :(得分:0)
如果差异可能在任何地方,那么你将被迫使用代码。我认为你可以使用XPath或DOM。对于XPath,你可以删除差异的XPath,直到它在@NgModule({
imports: [...],
declarations: [MyComp , ColorFlip ]
})
上选择正确的associate
,并在控制或测试文档上使用Java的XPath引擎(给定节点匹配器时,id应该是相同的)。 XMLUnit的XPath API可以简化这一过程。
使用DOM的方法类似,您可以从associateId
Comparison
target
向上走,直到找到名为{{1}的元素}}