比较两个忽略元素和属性顺序的XMl文件
我是这个领域的新手,被分配了一项具有挑战性的任务。 我有两个XML文件(即Test1和Test2,如下所述)。我需要使用java比较这些xml文件,如果没有差异,则将布尔值返回为true。这里的挑战是第二个Xml文件(Test2.Xml),元素顺序总是混乱的。我尝试了XMLUnit2来比较这两个xml字符串,但如果存在多个父节点或大型xml,则会失败
测试1。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)));
}
}
# 1 楼答案
我假设您以
String
的形式获取这两个文件例如
String xml1 = .. , String xml2 = ..
您可以尝试以下选项:
1)您可以解析这两个字符串,并逐个比较每个元素
2)可以使用XMLUnit-https://www.xmlunit.org/
# 2 楼答案
我所知道的所有用于比较XML文档的现成方法都将元素顺序视为有意义的。我认为你必须设计一种对这些文档的转换,通过将它们规范化为一种公共形式来消除不相关的差异,然后比较规范化的形式。进行这种转换的明显方法是XSLT