我想在Junit测试之一中比较两个XML。
我正在使用XMLUnit进行xml比较。能否告诉我是否有任何简单的方法可以忽略xmls中correlation-id
的比较。
XML1:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<bih-metadata>
<result>Error</result>
<correlation-id>ID:925977d0-83cd-11e6-b94d-c135e6c73218</correlation-id>
<error-message>SAXParseException: The entity name must immediately follow the '&' in the entity reference.</error-message>
</bih-metadata>
</response>
XML2:
<?xml version="1.0" encoding="UTF-8"?>
<response>
<bih-metadata>
<result>Error</result>
<correlation-id>ID:134345d0-83cd-11e6-b94d-c135e6c73218</correlation-id>
<error-message>SAXParseException: The entity name must immediately follow the '&' in the entity reference.</error-message>
</bih-metadata>
</response>
最佳答案
这是在XMLUnit 2.x中添加的NodeFilter
:
import org.w3c.dom.Element;
import org.xmlunit.builder.DiffBuilder;
import org.xmlunit.util.Nodes;
import org.xmlunit.diff.*;
public class Test {
public static void main(String[] args) {
Diff d = DiffBuilder.compare("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<response>\n" +
"<bih-metadata>\n" +
"<result>Error</result>\n" +
"<correlation-id>ID:925977d0-83cd-11e6-b94d-c135e6c73218</correlation-id>\n" +
"<error-message>SAXParseException: The entity name must immediately follow the '&' in the entity reference.</error-message>\n" +
"</bih-metadata>\n" +
"</response>")
.withTest("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<response>\n" +
"<bih-metadata>\n" +
"<result>Error</result>\n" +
"<correlation-id>ID:134345d0-83cd-11e6-b94d-c135e6c73218</correlation-id>\n" +
"<error-message>SAXParseException: The entity name must immediately follow the '&' in the entity reference.</error-message>\n" +
"</bih-metadata>\n" +
"</response>")
.withNodeFilter(n -> !(n instanceof Element && "correlation-id".equals(Nodes.getQName(n).getLocalPart())))
.build();
System.err.println("Different? " + d.hasDifferences());
}
}