有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

比较两个忽略元素和属性顺序的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))); } }
Tags:  

共 (2) 个答案

  1. # 1 楼答案

    我假设您以String的形式获取这两个文件

    例如String xml1 = .. , String xml2 = ..

    您可以尝试以下选项:

    1)您可以解析这两个字符串,并逐个比较每个元素

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

  2. # 2 楼答案

    我所知道的所有用于比较XML文档的现成方法都将元素顺序视为有意义的。我认为你必须设计一种对这些文档的转换,通过将它们规范化为一种公共形式来消除不相关的差异,然后比较规范化的形式。进行这种转换的明显方法是XSLT