Ограничения блока xml

Я пытаюсь сравнить 2 XML-файла, которые похожи (для тестирования я только что изменил порядок элементов с помощью randomize-tool) с XMLUnit.

Есть ли ограничения по максимальному количеству элементов или максимальной сложности элементов и дочерних элементов?

Пока мой XML-файл не слишком длинный, а элементы довольно просты, все работает отлично.

Но как только появляются слишком сложные элементы (до пяти подэлементов), подобное возвращает false, и я получаю diff, которых не существует.

Мое первое впечатление, что тот же результат произойдет, если я получу слишком много простых элементов. Но это не обязательно прямо сейчас.

Кто-нибудь знает что-то об ограничениях по умолчанию модуля XML и есть ли возможность настроить их для моего опыта?

Возможно, я должен упомянуть, что я должен игнорировать определенный Элемент в сложных элементах. Я не уверен, если это имеет значение. Это не в менее сложных элементах.

package newXMLComperator;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import org.custommonkey.xmlunit.DetailedDiff;
import org.custommonkey.xmlunit.Diff;
import org.custommonkey.xmlunit.Difference;
import org.custommonkey.xmlunit.XMLUnit;
import    org.custommonkey.xmlunit.examples.RecursiveElementNameAndTextQualifier;



public class Arbeiter {

private File quelle, vergleich; 

public Arbeiter(File quelle, File vergleich) {
    this.quelle=quelle; 
    this.vergleich=vergleich;
}

public void vergleichen()
{
    long tbevore = System.currentTimeMillis();
    XMLUnit.setIgnoreAttributeOrder(Boolean.TRUE);
    XMLUnit.setIgnoreWhitespace(Boolean.TRUE);
    String f1 = lesen(quelle);
    String f2 = lesen(vergleich);

    try {
        Diff diff = new Diff(f1, f2);
        diff.overrideElementQualifier(new RecursiveElementNameAndTextQualifier());
        diff.overrideDifferenceListener(new IgnoreNamedElementsDifferenceListener(findSVSW_ID(quelle)));
        DetailedDiff dd = new DetailedDiff(diff);
        boolean result = dd.similar();

        StringBuilder sb = new StringBuilder(); 
        if (result ==true)
        {
            sb.append("Die Dateien sind inhaltsgleich");
        }
        else
        {
            sb.append("Die Dateien unterscheiden sich \n \n");
            List<Difference>list = dd.getAllDifferences();
            for (Difference aktuell : list)
            {
                if (!aktuell.isRecoverable())
                {
                    sb.append("Der Ausdruck "+aktuell.getControlNodeDetail().getValue()+" wurde gesucht \n");
                    sb.append("Der Ausdruck "+aktuell.getTestNodeDetail().getValue()+" wurde gefunden \n");
                    sb.append("Xpath: "+aktuell.getTestNodeDetail().getXpathLocation()+"\n \n");

                }
            }
        }
        long tafter = System.currentTimeMillis();
        String dauer = Long.toString((tafter-tbevore)/1000);
        sb.append("Die Bearbeitung dauerte " +dauer+" Sekunden \n");
        speichern(sb.toString());

    }
    catch (Exception e)
    {
        e.printStackTrace();
    }




}

private String lesen(File datei)
{
    String result ="";
    try {
        BufferedReader leser = new BufferedReader(new FileReader(datei));
        StringBuilder sb = new StringBuilder();
        String gelesen = leser.readLine();
        while (gelesen!=null)
        {
            sb.append(gelesen);
            gelesen=leser.readLine();
        }
        result=sb.toString();
        leser.close();
    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return result;
}

private List<String> findSVSW_ID(File datei)
{
    List<String>liste = new ArrayList<String>();
    liste.add("AUFTRAGSCHLUESSEL");
    liste.add("LIEFERUNGSCHLUESSEL");
    try {
        BufferedReader leser = new BufferedReader(new FileReader(datei));
        String gelesen = leser.readLine();
        while (gelesen!=null)
        {
            if (gelesen.contains("SVSW_ID"))
            {
                String [] teile = gelesen.split(">");
                String temp = teile[0].replaceAll("<", "");
                if (!liste.contains(temp))
                {
                    String t2=temp.replaceAll(" ", "");
                    liste.add(t2);
                }

            }
            gelesen=leser.readLine();
        }


    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }


    return liste;
}

private void speichern(String text)
{
    File datei = new File(quelle.getParent()+"/ausgabe.txt");
    try {
        BufferedWriter schreiber = new BufferedWriter(new FileWriter(datei));
        schreiber.write(text);
        schreiber.flush();
        schreiber.close();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

}

Спасибо за помощь

2 ответа

Единственное реальное ограничение - память. XMLUnit использует DOM под одеялом, а большой документ может потребовать много памяти. Но если вам не хватает памяти, результатом является исключение, а не ложные различия.

Также в зависимости от вашего ElementQualifier сравнение может стать довольно медленным, так как потенциально все дочерние элементы тестового узла сравниваются со всеми дочерними элементами контрольного узла. Это намного более чувствительно к количеству дочерних элементов одного узла - может быть, ширине дерева - чем количеству уровней - высоте дерева.

Трудно сказать, какие "несуществующие" различия вы видите. Обычно происходит то, что XMLUnit не сравнивает элементы, которые, как вы думаете, должны, потому что ElementQualifier неправильно.

Обратите внимание, что вы используете XMLUnit 1.x, в то время как текущая версия 2.2.1 - 2.x имеет довольно другой API, но разделяет вышеуказанные ограничения по размеру / скорости с 1.x.

Спасибо за быструю поддержку. Я попробую еще раз.

После прочтения 3.4.4. из http://xmlunit.sourceforge.net/userguide/html/ar01s03.html Я думаю, что RecursiveElementNameAndTextQuaifier является правильным, потому что порядок моих дочерних узлов отличается между тестовым и контрольным узлом.

Верно ли мое понимание того, что только RecursiveElementNameAndTextQuaifier может выполнить мои требования без подчинения количеству уровней в моих дочерних узлах?

Использование памяти, кажется, в порядке. При применении метода.s Similar() виртуальная машина Java использует около 3 ГБ. Это не должно быть проблемой вообще.

еще раз спасибо

Другие вопросы по тегам