7

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

谢谢。

4

7 回答 7

13

如果你只是想比较然后使用这个:

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/

于 2012-04-25T08:05:35.780 回答
5

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

  • 两段 XML 的区别
  • 使用 XSLT 转换一段 XML 的结果
  • 对一段 XML 的 XPath 表达式求值
  • 一段 XML 的有效性
  • 由 DOM Traversal 公开的一段 XML 中的各个节点

祝你好运!

于 2012-04-25T08:06:20.743 回答
4

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

于 2012-04-25T08:04:43.030 回答
3

一般来说,如果您知道您有两个具有相同结构但略有不同且内容无序的文件,您将不得不“读取”这些文件以比较内容。

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

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

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

我希望这有帮助。

于 2012-04-25T08:12:44.463 回答
1

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

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

于 2012-04-25T08:00:17.367 回答
1

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

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

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

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

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

于 2012-04-25T08:38:12.113 回答
0

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

于 2012-04-25T08:07:18.833 回答