使用JAVA比较两个xml文件

时间:2012-04-25 07:54:18

标签: java xml

我要xml文件说abc.xml& 123.xml几乎相似,我的意思是内容相同,但第二个,即123.xml的内容比前一个更多。 我想用Java读取这两个文件,并比较每个标记的abc.xml中的内容是否与123.xml中的内容相同,类似于对象比较。 请建议我如何使用java读取xml文件并开始比较。

感谢。

7 个答案:

答案 0 :(得分:12)

如果您只想比较,请使用此:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
dbf.setCoalescing(true);
dbf.setIgnoringElementContentWhitespace(true);
dbf.setIgnoringComments(true);
DocumentBuilder db = dbf.newDocumentBuilder();

Document doc1 = db.parse(new File("file1.xml"));
doc1.normalizeDocument();

Document doc2 = db.parse(new File("file2.xml"));

doc2.normalizeDocument();
Assert.assertTrue(doc1.isEqualNode(doc2));

否则看到这个 http://xmlunit.sourceforge.net/

答案 1 :(得分:5)

我会选择XMLUnit。 它提供的功能:

  • 两段XML之间的差异
  • 使用XSLT转换XML片段的结果
  • 评估XML片段上的XPath表达式
  • 一段XML的有效性
  • a。中的个别节点 DOM Traversal公开的XML片段

祝你好运!

答案 2 :(得分:4)

我会使用JAXB从XML文件生成Java对象,然后比较Java文件。他们会使处理更容易。

答案 3 :(得分:3)

一般情况下,如果您知道有两个文件具有相同的结构但内容略有不同且无序,则您必须“读取”文件以比较内容。

如果您拥有XML文件的XML Schema,那么您可以使用JAXB创建一组类,这些类将表示由XML模式定义的特定DOM。这种方法的好处是,您不必通过元素和属性的通用函数解析XML文件,而是通过对您的问题有意义的实际字段解析XML文件。

当然,为了能够检测两个文件中是否存在相同条目,您必须通过某些公共字段(例如,某些ID)将它们“匹配”。

为了帮助您完成重复发现过程,您可以使用Java集合中的一些相关数据结构,例如Set(或其衍生产品之一)

我希望这会有所帮助。

答案 4 :(得分:1)

如果您只是想比较和显示,那么您可以使用Guiffy

这是一个很好的工具。如果你想在后端进行处理,那么你必须使用DOM解析器将两个文件加载到2个DOM对象,并按属性比较属性。

答案 5 :(得分:1)

正确的方法取决于两个因素:

(a)您希望对比较的控制程度如何?例如,您是否需要控制空格是否重要,是否应忽略注释,是否应忽略名称空间前缀,是否应忽略冗余名称空间声明,是否应忽略XML声明?

(b)你想要什么答案? (i)布尔值:相同/不同,(ii)适合人类处理的差异列表,(iii)适合申请处理的差异列表。

我使用的两种技术是:(a)将两个文件转换为Canonical XML,然后比较字符串。这给出了很少的控制,只给出了一个布尔结果。 (b)使用XPath 2.0 deep-equal()函数或扩展Saxon版本saxon比较两棵树:deep-equal()。 Saxon版本可以更好地控制比较的方式,并提供更详细的差异报告(用于人类阅读,而非应用程序使用)。

如果您想编写Java代码,您当然可以实现自己的比较逻辑 - 例如,您可以找到XPath深度相等的开源实现,并修改它以满足您的要求。它只有大约一百行代码。

答案 6 :(得分:0)

它有点矫枉过正,但如果您的XML有架构,您可以将其转换为EMF元模型&然后使用EMF Compare进行比较。