1

これが私が解決しようとしている問題です。

  1. XMLファイルを含む2つのフォルダーがあります。
  2. 1つのフォルダ(たとえば「ソース」フォルダ)には、約350,000個のXMLファイルが含まれています。
  3. 別のフォルダ(「比較」フォルダとしましょう)には、同じ350,000個のXMLファイルとさらにいくつかのファイルが含まれています。
  4. 両方に存在する350,000ファイルは同じ名前です。まったく同じです。
  5. ただし、「ソース」のファイルは「比較」のファイルとは少し異なります。比較対象のファイルには、追加のノードがある場合とない場合があります。
  6. 「ソース」と「比較」の「同じ名前のファイル」を比較する必要があります。-「ソース」内のファイルごとに-「ソース」のファイルに存在するすべてのノードが「比較」のファイルに存在する場合-OKレポートを作成する必要があります。
  7. そうでない場合、すなわち
  8. 「比較」に存在しない「ソース」にいくつかのファイルがあります
  9. 「ソース」のファイルには、「比較」の対応するファイルに存在しないノードがあります。
  10. 次に、不足しているものの詳細を含むエラーレポートを作成する必要があります。

私は現在、この問題に対してJava + XMLUnitを追求していますが、それで解決できるかどうかはわかりません。たとえそうだとしても、これが最適なツールの選択であるかどうかは確かにわかりません。

どんな助け/提案も大歓迎です。

4

4 に答える 4

2

個人的には、フォルダー全体でファイル比較を行い、同じ名前でチェックサムのサイズが異なるファイルを見つけたら、ノードをチェックします。同じ名前、同じサイズ、同じチェックサムのファイルをチェックしても意味がありません。

于 2012-06-01T09:31:15.587 に答える
1

手順を進める必要があります。

  1. 350,000ファイルを一覧表示します。「比較」フォルダにあるこれらの余分なファイルは、問題には関係ありません。
  2. まったく同じファイルを考慮して、比較するファイルの数を絞り込みます。Stirngがハッシュコードを使用して比較するように、それらをロードして、結果の文字列を比較するだけです。
  3. 両方のフォルダーにあるxmlファイルのインスタンスを比較します。そのための最善の方法は、XMLUnitを使用することだと思います。次のようになります。

    Diff diff = new Diff(sourceXml, compareXml); if (diff.identical()) { // whatever you want to do }

もちろん、これはファイルが大きすぎない場合に最適に機能します。

于 2012-06-01T09:46:30.730 に答える
1

DeltaXML製品を見てください。自分でコードを書くよりもおそらく安いでしょう。

于 2012-06-01T12:59:57.937 に答える
0

まず最初に。記録に残して、XMLUnitは宝石だと言いましょう。私はそれが好きだった。XML値/属性/構造などの単体テストを検討している場合は、XMLUnitを使用した既製のソリューションが見つかる可能性があります。これは、から始めるのに適した場所です。

それはかなり拡張可能です。すでにIDチェック(XMLの場合は同じ要素と属性が同じ順序である)または類似性チェック(XMLの場合は順序に関係なく同じ要素と属性があるため)が付属しています。

しかし、私の場合は少し違う使い方を探していました。私は大きなXML(数百ノード)とたくさんのXMLファイル(そのうちの約350,000ノード)を持っていました。XPATHで識別できる特定のノードを比較する必要はありませんでした。それらは必ずしもXML内で同じ位置にあるとは限りませんが、XPATHを使用してそれらを識別する一般的な方法がいくつかありました。他のノードの値に基づいて、一部のノードが無視される場合がありました。アイデアを出すためだけに

  1. ここでのロジックは、無視したいノード、つまり価格にあります。/ bookstore / book [price> 35] / price

  2. ここでのロジックは、相対位置にあるノード上にあります。価格の価値に基づいて著者を無視したい。そして、これら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++;
            }
        }
    }

お役に立てれば。

于 2012-06-11T11:14:58.143 に答える