以下是我要解决的问题。
我目前正在针对此问题寻求Java + XMLUnit,并且不确定是否可以解决它。即使它是,我绝对不确定这是否是最佳的工具选择。
非常感谢任何帮助/建议。
答案 0 :(得分:2)
就个人而言,我只会在整个文件夹上进行文件比较,然后当我找到具有相同名称但是校验和大小不同的文件时,请检查节点。如果文件具有相同的名称,相同的大小和相同的校验和,则无需检查文件。
答案 1 :(得分:1)
您需要按步骤继续。
比较两个文件夹中xml文件的实例。我认为最好的方法是使用XMLUnit。 应该是这样的:
Diff diff = new Diff(sourceXml, compareXml);
if (diff.identical()) {
// whatever you want to do
}
当然,如果你的文件不是太大,这种方法效果最好。
答案 2 :(得分:1)
看看DeltaXML产品;它可能比自己编写代码便宜。
答案 3 :(得分:0)
首先要做的事情。让我记录下来,说XMLUnit是一个宝石。我爱它。如果您正在查看XML值/属性/结构等的单元测试,您可能会发现使用XMLUnit的现成解决方案。 This is a good place to start from。
它非常具有可扩展性。它已经带有身份检查(如在XML中具有相同顺序的相同元素和属性)或相似性检查(如在XML中具有相同的元素和属性,无论顺序如何)。
然而,就我而言,我一直在寻找略有不同的用法。我有一个很大的XML(几百个节点)和一堆XML文件(大约350,000个)。我不需要比较某些特定的节点,我可以用XPATH来识别它们。它们不一定总是在XML中处于相同的位置,但有一些通用的方法用XPATH识别它们。有时,某些节点会根据其他一些节点的值被忽略。只是提出一些想法
这里的逻辑是我要忽略的节点,即价格。 /书店/书[价格> 35] /价格
此处的逻辑位于处于相对位置的节点上。我想根据价格的价值忽略作者。而这两者是相关的。 /书店/书[价= 30] /./作者
经过多次修修补补后,我选择了低技术解决方案。在使用XMLUnit比较文件之前,我使用XPATH来屏蔽要忽略的节点的值。
public static int massageData(File xmlFile, Set<String> xpaths, String mask)
throws JDOMException, IOException {
logger.debug("Data massaging started for " + xmlFile.getAbsolutePath());
int counter = 0;
Document doc = (Document) new SAXBuilder().build(xmlFile
.getAbsolutePath());
for (String xpath : xpaths) {
logger.debug(xpath);
XPathExpression<Element> xpathInstance = XPathFactory.instance()
.compile(xpath, Filters.element());
List<Element> elements = xpathInstance.evaluate(doc);
// element = xpathInstance.evaluateFirst(doc);
if (elements != null) {
if (elements.size() > 1) {
logger.warn("Multiple matches were found for " + xpath
+ " in " + xmlFile.getAbsolutePath()
+ ". This could be a *potential* error.");
}
for (Element element : elements) {
logger.debug(element.getText());
element.setText(mask);
counter++;
}
}
}
希望这会有所帮助。