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

时间:2018-08-30 10:14:46

标签: java xml xmlunit-2

我是该领域的新手,并且已分配有挑战性的任务。 我有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)));

}  
	}

2 个答案:

答案 0 :(得分:0)

我假设您同时将两个文件都作为String

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

您可以尝试以下选项:

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

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

答案 1 :(得分:0)

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