Сравнение двух файлов XMl, игнорирующих элемент и порядок атрибутов Java Eclipse - PullRequest
0 голосов
/ 30 августа 2018

Я новичок в этой области, и ему было поручено сложное задание. У меня есть 2 XML-файла (а именно Test1 и Test 2, как указано ниже). И мне нужно сравнить эти xml-файлы с использованием java и вернуть логическое значение как true, если нет различий. И проблема здесь заключается во втором Xml-файле (Test2.xml), порядок элементов всегда перемешан. Я попытался использовать XMLUnit2 для сравнения двух строк 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 голосов
/ 30 августа 2018

Все стандартные методы сравнения XML-документов рассматривают порядок элементов как существенный. Я думаю, что вам придется разработать преобразование в эти документы, которое устранит несущественные различия путем нормализации их к общей форме, а затем сравнит нормализованные формы. Очевидный способ сделать это преобразование в XSLT.

0 голосов
/ 30 августа 2018

Я предполагаю, что вы получаете оба файла как String.

ех. String xml1 = .. , String xml2 = ..

Вы можете попробовать следующие варианты:

1) Вы можете анализировать обе строки и сравнивать каждый элемент один за другим

2) вы можете использовать XMLUnit - https://www.xmlunit.org/

...