2017-02-07 5 views
1

Мне нужно сравнить 2 строки xml.Сравните Xml в текстовом блоке java, игнорируя атрибут в узле

Фактический

<?xml version="1.0" encoding="utf-8"?> 
    <entry xmlns="http://www.w3.org/2005/Atom" 
     xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
     xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
     xml:base="http://localhost:49531/ODataV2.svc/ODataV2.svc/"> 
     <content type="application/xml"> 
      <m:properties> 
       <d:ID>2000</d:ID> 
       <d:ReleaseDate>1992-01-01T00:00:00</d:ReleaseDate> 
       <d:Rating>4</d:Rating> 
       <d:Price>2.5</d:Price> 
      </m:properties> 
     </content> 
    </entry> 

Ожидаемое

<?xml version="1.0" encoding="utf-8"?> 
<entry xmlns="http://www.w3.org/2005/Atom" 
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
    xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
    xml:base="http://localhost:55615/ODataV2.svc/ODataV2.svc/"> 
    <content type="application/xml"> 
     <m:properties> 
      <d:ID>2000</d:ID> 
      <d:ReleaseDate>1992-01-01T00:00:00</d:ReleaseDate> 
      <d:Rating>4</d:Rating> 
      <d:Price>2.5</d:Price> 
     </m:properties> 
    </content> 
</entry> 

ниже код не потому, что номер порта в атрибуте XML: база отличается в корневом узле.

XMLAssert.assertXMLEqual(Actual, Expected); 

Ожидаемое значение атрибута 'http://localhost:55615/ODataV2.svc/ODataV2.svc/', но был 'http://localhost:49531/ODataV2.svc/ODataV2.svc/'

номер порта в блоке тестовых изменений в режиме исполнения. Есть ли способ игнорировать конкретный атрибут и сравнить xml.

+1

возможно дубликат http://stackoverflow.com/questions/1241593/java-how-do-i-ignore-certain-elements-when-comparing-xml & http://stackoverflow.com/questions/5249031/xmlunit-ignoring-id-attribute-in-compare – Redlab

ответ

0

Найдено Решение. Я использовал библиотеку custommonkey для сравнения xml. Вместо XMLAssert.assertXMLEqual(Actual, Expected);

Я использовал приведенный ниже код, чтобы определить разницу.

Diff diff=XMLUnit.compareXML(Expected,Actual); 
    diff.overrideDifferenceListener(new DifferenceListener() { 
     public void skippedComparison(Node arg0, Node arg1) { 
     } 

     public int differenceFound(Difference difference) { 
     if (difference.getControlNodeDetail().getXpathLocation().contains("entry")) { 
      return DifferenceListener.RETURN_IGNORE_DIFFERENCE_NODES_IDENTICAL; 
     } else { 
      return DifferenceListener.RETURN_ACCEPT_DIFFERENCE; 
     } 
     } 
    }); 
XMLAssert.assertXMLIdentical(diff,true); 
1

Я знаю, что не будет самым крутым или фантазийным решением, но вы можете «разобрать» оба XML перед их сравнением и удалить или изменить значение этого атрибута на что-то подобное в обоих, поэтому, когда вы позже их сравниваете, вы уверены, что вещь не повлияет на результат

+0

В общем, это единственное решение. Способ игнорировать различия состоит в том, чтобы замаскировать их, нормализуя оба значения (обычно используя XSLT), чтобы исключить области/узлы, где вам не нужны различия. –

1

XMLUnit 2.x имеет концепцию NodeFilter с и AttributeFilter с, которые являются простыми Predicate s.

assertThat(Actual, isIdenticalTo(Expected) 
    .withAttributeFilter(a -> !"base".equals(a.getName()))) 

, вероятно, будет работать.