我必须说 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));
我会选择XMLUnit。它提供的功能:
祝你好运!
我会使用 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) 将两个文件都转换为规范 XML,然后比较字符串。这几乎没有控制,只给出一个布尔结果。(b) 使用 XPath 2.0 deep-equal() 函数或扩展的 Saxon 版本 saxon:deep-equal() 比较两棵树。Saxon 版本可以更好地控制比较的完成方式,并提供更详细的发现差异报告(供人类阅读,而不是供应用程序使用)。
如果您想编写 Java 代码,您当然可以实现自己的比较逻辑 - 例如,您可以找到 XPath deep-equal 的开源实现,并对其进行修改以满足您的要求。它只有一百行左右的代码。
这有点矫枉过正,但如果您的 XML 有模式,您可以将其转换为 EMF 元模型,然后使用 EMF 比较进行比较。