繁体   English   中英

比较两个XMl文件,忽略元素和属性顺序Java eclipse

[英]Comparing two XMl files ignoring element and attribute order Java eclipse

我是该领域的新手,并已分配有挑战性的任务。 我有2个XML文件(即如下所述的Test1和Test 2)。 而且我需要使用Java比较这些xml文件,如果没有差异,则将布尔值返回为true。这里的挑战是元素顺序总是很混乱的第二个Xml文件(Test2.xml)。 我尝试使用XMLUnit2比较2个xml字符串,但是如果有多个父节点或较大的xml,则会失败。

Test1.Xml:

 Test1.Xml: <PACKINGS> <PACKING> <TYPE>CCST</TYPE> <ORDERNUM>810000510</ORDERNUM> <SVCTAGS> <SVCTAG> <SVCTAGTYPE>DRAGON</SVCTAGTYPE> <SVCTAGNUMBER>768100005105001</SVCTAGNUMBER> <TIENUMBER>1</TIENUMBER> <BOXID>768100005105001</BOXID> <LENGTH>4</LENGTH> <WIDTH>5</WIDTH> <HEIGHT>10</HEIGHT> <PARTS> <PART> <PARTNUMBER>RKH5D</PARTNUMBER> <PARTQTY>10</PARTQTY> </PART> </PARTS> </SVCTAG> <SVCTAG> <SVCTAGTYPE>DRAGON</SVCTAGTYPE> <SVCTAGNUMBER>768100005105002</SVCTAGNUMBER> <TIENUMBER>2</TIENUMBER> <BOXID>768100005105002</BOXID> <LENGTH>4</LENGTH> <WIDTH>5</WIDTH> <HEIGHT>10</HEIGHT> <PARTS> <PART> <PARTNUMBER>FHMTN</PARTNUMBER> <PARTQTY>10</PARTQTY> </PART> </PARTS> </SVCTAG> </SVCTAGS> </PACKING> </PACKINGS> 

 Test2.Xml: <PACKINGS> <PACKING> <TYPE>CCST</TYPE> <ORDERNUM>810000510</ORDERNUM> <SVCTAGS> <SVCTAG> <SVCTAGTYPE>DRAGON</SVCTAGTYPE> <SVCTAGNUMBER>768100005105002</SVCTAGNUMBER> <TIENUMBER>2</TIENUMBER> <BOXID>768100005105002</BOXID> <LENGTH>4</LENGTH> <WIDTH>5</WIDTH> <HEIGHT>10</HEIGHT> <PARTS> <PART> <PARTNUMBER>FHMTN</PARTNUMBER> <PARTQTY>10</PARTQTY> </PART> </PARTS> </SVCTAG> <SVCTAG> <SVCTAGTYPE>DRAGON</SVCTAGTYPE> <SVCTAGNUMBER>768100005105001</SVCTAGNUMBER> <TIENUMBER>1</TIENUMBER> <BOXID>768100005105001</BOXID> <LENGTH>4</LENGTH> <WIDTH>5</WIDTH> <HEIGHT>10</HEIGHT> <PARTS> <PART> <PARTNUMBER>RKH5D</PARTNUMBER> <PARTQTY>10</PARTQTY> </PART> </PARTS> </SVCTAG> </SVCTAGS> </PACKING> </PACKINGS> 

以下是我尝试过的代码,但使用xml单元失败:

 package com.com.java; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.*; import org.custommonkey.xmlunit.Diff; import org.custommonkey.xmlunit.XMLAssert; import org.testng.annotations.Test; import org.xmlunit.builder.DiffBuilder; import org.xmlunit.builder.Input; import org.xmlunit.diff.DefaultNodeMatcher; import org.xmlunit.diff.ElementSelectors; import org.xmlunit.matchers.CompareMatcher; public class TestNg { @Test public void testXmlUnit() { String ControlXML = "<PACKINGS><PACKING><TYPE>CCST</TYPE><ORDERNUM>810000510</ORDERNUM><SVCTAGS><SVCTAG><SVCTAGTYPE>DRAGON</SVCTAGTYPE><SVCTAGNUMBER>768100005105002</SVCTAGNUMBER><TIENUMBER>2</TIENUMBER><BOXID>768100005105002</BOXID><LENGTH>4</LENGTH><WIDTH>5</WIDTH><HEIGHT>10</HEIGHT></SVCTAG><SVCTAG><SVCTAGTYPE>DRAGON</SVCTAGTYPE><SVCTAGNUMBER>768100005105001</SVCTAGNUMBER><TIENUMBER>1</TIENUMBER><BOXID>768100005105001</BOXID><LENGTH>4</LENGTH><WIDTH>5</WIDTH><HEIGHT>10</HEIGHT><PARTS><PART><PARTNUMBER>RKH5D</PARTNUMBER><PARTQTY>10</PARTQTY></PART></PARTS></SVCTAG></SVCTAGS></PACKING></PACKINGS>"; String testXml = "<PACKINGS><PACKING><TYPE>CCST</TYPE><ORDERNUM>810000510</ORDERNUM><SVCTAGS><SVCTAG><SVCTAGTYPE>DRAGON</SVCTAGTYPE><SVCTAGNUMBER>768100005105001</SVCTAGNUMBER><TIENUMBER>1</TIENUMBER><BOXID>768100005105001</BOXID><LENGTH>4</LENGTH><WIDTH>5</WIDTH><HEIGHT>10</HEIGHT></SVCTAG><SVCTAG><SVCTAGTYPE>DRAGON</SVCTAGTYPE><SVCTAGNUMBER>768100005105002</SVCTAGNUMBER><TIENUMBER>2</TIENUMBER><BOXID>768100005105002</BOXID><LENGTH>4</LENGTH><WIDTH>5</WIDTH><HEIGHT>10</HEIGHT><PARTS><PART><PARTNUMBER>FHMTN</PARTNUMBER><PARTQTY>10</PARTQTY></PART></PARTS></SVCTAG></SVCTAGS></PACKING></PACKINGS>"; assertThat(testXml, CompareMatcher.isSimilarTo(ControlXML).ignoreWhitespace().normalizeWhitespace().withNodeMatcher(new DefaultNodeMatcher(ElementSelectors.byNameAndText, ElementSelectors.byName))); } } 

我假设您将两个文件都作为String获取。

恩。 String xml1 = .. , String xml2 = ..

您可以尝试以下选项:

1)您可以解析两个String并逐一比较每个元素

2)您可以使用XMLUnit - https: //www.xmlunit.org/

我知道用于比较XML文档的所有现成方法都将元素顺序视为重要的。 我认为您将不得不设计对这些文档的转换,以消除不相关的差异,方法是将它们标准化为通用格式,然后比较标准化的格式。 进行这种转换的明显方法是在XSLT中。

暂无
暂无

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

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