我希望我的 Java 程序在比较 2 个 XML 时忽略一些属性。我不想使用节点过滤器,因为它也会从比较中忽略子元素。我为属性过滤器尝试了不同的实现,但没有任何效果。当我使用节点过滤器时,过滤工作。问题只是属性过滤器。有人可以指出哪里出错了吗?
XML 测试文档的一部分
<?xml version="1.0"?>
<!DOCTYPE cXML SYSTEM "http://xml.cxml.org/schemas/cXML/1.2.009/Fulfill.dtd">
<cXML payloadID="{hh896538025}" timestamp="2019-12-02">
<Header>
<!lines of text>
</Header>
<Request>
<ConfirmationRequest>
<ConfirmationHeader operation="new" noticeDate="2019-12-20">
<............>
</ConfirmationHeader>
<OrderReference orderID="jkd578zw6nr" orderDate="2019-12-20">
<DocumentReference payloadID="l90p459s35" />
</OrderReference>
</ConfirmationRequest>
</Request>
<cXML>
要比较的 XML 也是相同的格式。
这是我的代码:
Diff diff =
DiffBuilder.compare(testDocument)
.withTest(ComparisonDocument)
.checkForSimilar()
.ignoreWhitespace()
.withAttributeFilter(attr -> (attr.getName().equals("timestamp")) || (attr.getName().equals("noticeDate")) || attr.getName().equals("confirmID") || attr.getName().equals("orderID") || attr.getName().equals("orderDate"))
// .withNodeFilter(node ->(node.getNodeName().equals("ConfirmationHeader") || node.getNodeName().equals("OrderReference")))
.withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.conditionalBuilder() .whenElementIsNamed("ConfirmationItem").thenUse(ElementSelectors.byXPath("./Name", ElementSelectors.byNameAndText)) .elseUse(ElementSelectors.byName).build())).build();