Как использовать XMLUnit2 для сравнения xmls по XPATH?
Я пытаюсь сравнить два XML только частично с использованием XMLUnit2. Я попытался ниже Xpath, чтобы сравнить элемент int
в одиночестве. Но мой тест не пройден, потому что он проверяет boolean
тег тоже.
Как мне пройти этот тест?
@Test
public void diff_through_xPath(){
String myControlXML = "<struct><boolean>false</boolean><int>3</int></struct>";
String myTestXML = "<struct><boolean>true</boolean><int>3</int></struct>";
ElementSelector childSelector = selectorForElementNamed("int", byXPath("//int", byName));
Diff myDiffSimilar = DiffBuilder.compare(myControlXML).withTest(myTestXML)
.withNodeMatcher(new DefaultNodeMatcher(childSelector, byName))
.checkForSimilar()
.ignoreWhitespace()
.build();
assertFalse("XML similar " + myDiffSimilar.toString(),
myDiffSimilar.hasDifferences());
}
Редактировать: С NodeFilter я удалил ненужные узлы из сравнения. Но есть ли способ дать Xpath и сравнить только узлы, оцененные XPath.
@Test
public void diff_through_xPath() {
String myControlXML = "<struct><boolean>false</boolean><int>3</int></struct>";
String myTestXML = "<struct><boolean>true</boolean><int>3</int></struct>";
Diff myDiffSimilar = DiffBuilder.compare(myControlXML).withTest(myTestXML)
.withNodeFilter(new Predicate<Node>() {
public boolean test(Node node) {
return !node.getNodeName().equals("boolean"); //ignores all child nodes from of 'a'.
}
})
//.checkForSimilar()
.ignoreWhitespace()
.build();
assertFalse("XML similar " + myDiffSimilar.toString(),
myDiffSimilar.hasDifferences());
}
1 ответ
Я не знаю, правильный ли это подход. Но в любом случае размещены здесь, чтобы получить комментарии от вас. Таким образом, я могу сравнивать только список узлов XML, оцененных XPath.
@Test
public void testXpath() throws Exception {
File controlFile = new File("src/test/resources/myControlXML.xml");
File testFile = new File("src/test/resources/myTest.xml");
Diff myDiff = DiffBuilder.compare(Input.fromDocument(getDocument("src/test/resources/myControlXML.xml", "/struct/int")))
.withTest(Input.fromDocument(getDocument("src/test/resources/myTest.xml", "/struct/int")))
.checkForSimilar().withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byName))
.ignoreWhitespace()
.build();
assertFalse("XML similar " + myDiff.toString(),
myDiff.hasDifferences());
}
public Document getDocument(String fileName, String xpathExpression) throws Exception {
File controlFile = new File(fileName);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
dBuilder = dbFactory.newDocumentBuilder();
Document controlDoc = dBuilder.parse(controlFile);
controlDoc.getDocumentElement().normalize();
XPath xPath = XPathFactory.newInstance().newXPath();
NodeList nodes = (NodeList) xPath.compile(xpathExpression).evaluate(
controlDoc, XPathConstants.NODESET);
Document newXmlDocument = DocumentBuilderFactory.newInstance()
.newDocumentBuilder().newDocument();
Element root = newXmlDocument.createElement("root");
newXmlDocument.appendChild(root);
for (int i = 0; i < nodes.getLength(); i++) {
Node node = nodes.item(i);
Node copyNode = newXmlDocument.importNode(node, true);
root.appendChild(copyNode);
}
return newXmlDocument;
}