2013-02-04 116 views
1

我想使用XMLUnit比较2个XML文件。我在Eclipse中尝试使用下面的代码,我已经将xml文件放在本地目录中进行比较。Java XML文件比较

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.net.URL; 
import java.util.List; 

import org.custommonkey.xmlunit.DetailedDiff; 
import org.custommonkey.xmlunit.Diff; 
import org.custommonkey.xmlunit.Difference; 
import org.xml.sax.SAXException; 

public class ComparisonTest { 

public static void main(String[] args) { 
    URL url1 = ComparisonTest.class.getResource("D:/reference.xml"); 
    URL url2 = ComparisonTest.class.getResource("D:/comparison.xml"); 
    FileReader fr1 = null; 
    FileReader fr2 = null; 
    try { 
     fr1 = new FileReader(url1.getPath()); 
     fr2 = new FileReader(url2.getPath()); 
    } catch (FileNotFoundException e) { 
     e.printStackTrace(); 
    } 

    try { 
     Diff diff = new Diff(fr1, fr2); 
     System.out.println("Similar? " + diff.similar()); 
     System.out.println("Identical? " + diff.identical()); 

     DetailedDiff detDiff = new DetailedDiff(diff); 
     List differences = detDiff.getAllDifferences(); 
     for (Object object : differences) { 
      Difference difference = (Difference)object; 
      System.out.println("***********************"); 
      System.out.println(difference); 
      System.out.println("***********************"); 
     } 

    } catch (SAXException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

} 

我得到一个错误

Exception in thread "main" java.lang.NullPointerException 
at com.org.comparison.ComparisonTest.main(ComparisonTest.java:21) 

我无法弄清楚,为什么?

+0

确保'url1'和'url2'不空。 –

+0

@NikitaBeloglazov - 它不考虑ComparisonTest.class.getResource(“D:/reference.xml”);? – shockwave

+0

否。如果找不到资源。检查[文档](http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html#getResource(java.lang.String)) –

回答

2

我不确定您是否可以传递“D:/reference.xml”作为资源。只是通过路径的FileReader构造:

FileReader fr1 = null; 
FileReader fr2 = null; 
try { 
    fr1 = new FileReader("D:/reference.xml"); 
    fr2 = new FileReader("D:/comparison.xml"); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

我敢肯定,getResource给你空。

URL url1 = ComparisonTest.class.getResource("D:/reference.xml"); 
URL url2 = ComparisonTest.class.getResource("D:/comparison.xml"); 
System.out.println(url1 + " " + url2); // I suppose output is "null null" 
+0

+1你为我节省了一天的时间 –

0

你得到这个错误,因为getResource()方法。它不会将引用对象返回到您的xml文件。您可以直接将文件名传递给FileReader构造函数,也可以创建File类对象。我已经禁止了你的代码块,你可以复制并运行它。它将工作100%:) :)

import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.net.URL; 
import java.util.List; 

import org.custommonkey.xmlunit.DetailedDiff; 
import org.custommonkey.xmlunit.Diff; 
import org.custommonkey.xmlunit.Difference; 
import org.xml.sax.SAXException; 

public class ComparisonTest { 

public static void main(String[] args) { 
File f1 = new File("D:/reference.xml"); 
File f2= new File("D:/comparison.xml"); 
FileReader fr1 = null; 
FileReader fr2 = null; 
try { 
    fr1 = new FileReader(f1); 
    fr2 = new FileReader(f2); 
} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} 

try { 
    Diff diff = new Diff(fr1, fr2); 
    System.out.println("Similar? " + diff.similar()); 
    System.out.println("Identical? " + diff.identical()); 

    DetailedDiff detDiff = new DetailedDiff(diff); 
    List differences = detDiff.getAllDifferences(); 
    for (Object object : differences) { 
     Difference difference = (Difference)object; 
     System.out.println("***********************"); 
     System.out.println(difference); 
     System.out.println("***********************"); 
    } 

} catch (SAXException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} 
} 

}