2

2 つの XML ファイルがあります。最初の XML には、2 番目の XML にも存在するはずの一連のノードがあります。2 番目の XML にもいくつかの余分なノードがある場合があります。このチェックを自動化できる Java ベースのプログラムが必要です。つまり、2 つの XML ファイルが与えられた場合、最初のファイルのすべてのノードが 2 番目の xml に存在することを教えてくれるはずです。

私は Java + XMLUnit を見ています。ただし、XMLUnit にはこれに対する正確な解決策はありません。助けてください。

ありがとう。

4

2 に答える 2

2

xmlunit のサンプル コードを次に示します。

そこにある 1 つの方法は、実際に 2 つXMLの を比較し、違いを見つけます。

 public void testCompareToSkeletonXML() throws Exception {
        String myControlXML = "<location><street-address>22 any street</street-address><postcode>XY00 99Z</postcode></location>";
        String myTestXML = "<location><street-address>20 east cheap</street-address><postcode>EC3M 1EB</postcode></location>";
        DifferenceListener myDifferenceListener = new IgnoreTextAndAttributeValuesDifferenceListener();
        Diff myDiff = new Diff(myControlXML, myTestXML);
        myDiff.overrideDifferenceListener(myDifferenceListener);
        assertTrue("test XML matches control skeleton XML " + myDiff, myDiff.similar());
    }

一方を他方と比較XMLして (一方をスケルトンのままにしてXML)、一方が他方のサブセットであるかどうかを調べることができます。

この方法では不十分な場合は、指定された 2 つの 間のすべての違いを見つける別の方法がありXMLます。

 public void testAllDifferences() throws Exception {
        String myControlXML = "<news><item id=\"1\">War</item>"
            + "<item id=\"2\">Plague</item><item id=\"3\">Famine</item></news>";
        String myTestXML = "<news><item id=\"1\">Peace</item>"
            + "<item id=\"2\">Health</item><item id=\"3\">Plenty</item></news>";
        DetailedDiff myDiff = new DetailedDiff(compareXML(myControlXML, myTestXML));
        List allDifferences = myDiff.getAllDifferences();
        assertEquals(myDiff.toString(), 0, allDifferences.size());
    }

詳細については、XMLUnit のドキュメントを参照してください。

于 2012-06-03T18:29:10.220 に答える
1

まず最初に。記録に残して、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:18:58.297 に答える