我要xml文件说abc.xml& 123.xml几乎相似,我的意思是内容相同,但第二个,即123.xml的内容比前一个更多。 我想用Java读取这两个文件,并比较每个标记的abc.xml中的内容是否与123.xml中的内容相同,类似于对象比较。 请建议我如何使用java读取xml文件并开始比较。
感谢。
答案 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));
答案 1 :(得分:5)
我会选择XMLUnit。 它提供的功能:
祝你好运!
答案 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进行比较。