2016-10-24 5 views
0

2つのXMLファイルを比較しようとしていますが、これはXMLUnitを使用して類似しています(テストのためにランダム化ツールで要素の順序を変更したばかりです)。XMLユニットの制限

要素の最大数または要素と子要素の最大複雑度には制限がありますか?

私のXMLファイルが長すぎず、要素がかなり単純である限り、すべて正常に動作します。

しかし、あまりにも複雑な要素(最大5つのサブ要素)があると、同様の結果が返され、存在しない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(); 
    } 
} 

}

ヘルプ

+0

はXMLUnitの制限のポストに関連している[XMLUnit - 比較上のXMLファイルのインデントの影響](のhttp://のstackoverflow。com/questions/5248517/xmlunit-xml-file-indentation-impacts-on-comparison)、[子ノードが順序付けしているためXMLunit比較の失敗](http://stackoverflow.com/questions/28683449/xmlunit-comparison-failure-because -child-nodes-order)を使用します。あなたのXMLエントリにこの機能がありましたか? –

答えて

0

ためのおかげで唯一の真の制限はメモリです。 XMLUnitはカバーの下でDOMを使用しており、大きな文書は大量のメモリを必要とします。しかし、メモリが足りなくなった場合、結果は例外であり、偽の違いではありません。

にもよりますが、テストノードのすべての子要素がコントロールノードのすべての子要素と比較される可能性があるため、比較がかなり遅くなる可能性があります。これは、木の高さである階層の数よりも、単一のノードの子供の数(おそらく木の幅)にはるかに敏感です。

どのような「存在しない」相違があるかは言うまでもありません。通常、何が起きるかは、ElementQualifierが間違っているため、XMLUnitが必要と思われる要素を比較していないということです。

現在のバージョンが2.2.1-2.xであるのに対し、XMLUnit 1.xを使用していますが、APIではなく、上記のサイズ/速度の制限が1.xであることに注意してください。

0

迅速なサポートをお寄せいただきありがとうございます。私はそれをさらに試してみましょう。

3.4.4を読んだ後。 http://xmlunit.sourceforge.net/userguide/html/ar01s03.html私は、子ノードの順序がテストノードとコントロールノードで異なるため、RecursiveElementNameAndTextQuaifierが正しいと思います。

私の理解は正しいですか、私の子ノードのレベルの数に従属することなく、RecursiveElementNameAndTextQuaifierだけで私の要件を達成できることは間違いありませんか?

メモリ使用量は問題ありません。 .similar()メソッドを適用している間、Java VMは約3 GBのラウンドを使用します。それはまったく問題ではありません。ここで

おかげで再び

関連する問題