繁体   English   中英

使用JAVA比较两个xml文件

[英]Comparing two xml files using JAVA

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

谢谢。

如果你只是想比较那么使用这个:

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/

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

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

祝好运!

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

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

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

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

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

我希望这有帮助。

好吧,如果你只想比较和显示,那么你可以使用Guiffy

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

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

(a)您想要对比较进行多少控制? 例如,您是否需要控制空格是否重要,是否应忽略注释,是否应忽略名称空间前缀,是否应忽略冗余名称空间声明,是否应忽略XML声明?

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM