2009-11-12 121 views
4

我想使用XMLUnit來比較兩個相似的XML文件。如何比較XMLUnit中的兩個類似XML文件

基本上每件事都是一樣的,File1File2的副本,但是在File2我改變了一個節點中某些元素的順序。

我想運行一個測試,它比較這些文件並返回類似一個結果,而不是把這些文件作爲不同

回答

7

我覺得這個鏈接可以幫助您 - http://www.ibm.com/developerworks/java/library/j-cq121906.html#N10158

基本上,如果你的文件1就像是 -

<account> 
<id>3A-00</id> 
<name>acme</name> 
</account> 

和file2是一樣的,但是不同僅僅在於在<name>秩序和<id> -

<account> 
<name>acme</name> 
<id>3A-00</id> 
</account> 

然後你可以編寫一個像下面這樣的測試,它會比較這些並返回相似的結果。

public void testIdenticalAndSimilar() throws Exception { 
    String controlXML = "<account><id>3A-00</id><name>acme</name></account>"; 
    String testXML = "<account><name>acme</name><id>3A-00</id></account>"; 
    Diff diff = new Diff(controlXML, testXML); 
    assertTrue(diff.similar()); 
    assertFalse(diff.identical()); 
} 

希望有幫助。

+0

當我使用字符串比較工作正常。但是當我使用該文件時,它不會。 我爲每個文件聲明InputSource對象,然後創建一個帶有兩個InputSource對象的Diff對象。當我以這種方式使用類似的命令時,它會失敗,並說這些文件是不同的。這是比較有效的方法嗎? – Ahmed 2009-11-13 00:56:03

+0

你的XML文件有多大?你能在這裏粘貼內容嗎? – 2009-11-13 17:13:32

+0

如何處理,如果任何標籤缺失比方說,從controlXML ID標籤丟失 字符串controlXML =「極致」; String testXML =「 acme 3A-00」; 如果有超過3個子節點,則比較顯示有線結果 – Pushkar 2014-10-29 05:58:19

3

這應做到:

// Assuming file1 and file2 are not deeply nested XML files 
    DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder(); 
    Document doc1 = docBuilder.parse(file1); 
    Document doc2 = docBuilder.parse(file2); 

    // SOLUTION 1: Are the files "similar"? 
    Diff diff = new Diff(doc1, doc2); 
    System.out.println("Similar (true/false): " + diff.similar()); 

    // SOLUTION 2: Should you want detailed differences (especially useful for deeply nested files) 
    Diff diff = new Diff(doc1, doc2); 
    diff.overrideElementQualifier(new RecursiveElementNameAndTextQualifier()); 
    DetailedDiff detailedDiff = new DetailedDiff(diff); 
    System.out.println("Detailed differences: " + detailedDiff.getAllDifferences().toString()); 

希望有點幫助。閱讀XMLUnit here