まず最初に。記録に残して、XMLUnitは宝石だと言いましょう。私はそれが好きだった。XML値/属性/構造などの単体テストを検討している場合は、XMLUnitを使用した既製のソリューションが見つかる可能性があります。これは、から始めるのに適した場所です。
それはかなり拡張可能です。すでにIDチェック(XMLの場合は同じ要素と属性が同じ順序である)または類似性チェック(XMLの場合は順序に関係なく同じ要素と属性があるため)が付属しています。
しかし、私の場合は少し違う使い方を探していました。私は大きなXML(数百ノード)とたくさんのXMLファイル(そのうちの約350,000ノード)を持っていました。XPATHで識別できる特定のノードを比較する必要はありませんでした。それらは必ずしもXML内で同じ位置にあるとは限りませんが、XPATHを使用してそれらを識別する一般的な方法がいくつかありました。他のノードの値に基づいて、一部のノードが無視される場合がありました。アイデアを出すためだけに
ここでのロジックは、無視したいノード、つまり価格にあります。/ bookstore / book [price> 35] / price
ここでのロジックは、相対位置にあるノード上にあります。価格の価値に基づいて著者を無視したい。そして、これら2つは位置によって関連付けられています。/bookstore/book[price=30]/./author
何度もいじくり回した後、私はローテクソリューションに落ち着きました。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++;
}
}
}
お役に立てれば。