我是该领域的新手,并且已分配有挑战性的任务。 我有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)));
}
}
答案 0 :(得分:0)
我假设您同时将两个文件都作为String
。
例如String xml1 = .. , String xml2 = ..
您可以尝试以下选项:
1)您可以解析两个String,并逐一比较每个元素
2)您可以使用 XMLUnit -https://www.xmlunit.org/
答案 1 :(得分:0)
我所知道的用于比较XML文档的所有现成方法都将元素顺序视为重要的。我认为您将不得不设计对这些文档的转换,以消除不相关的差异,方法是将它们标准化为通用格式,然后比较标准化的格式。进行这种转换的明显方法是在XSLT中。