2016-08-11 2 views
0

Я использую xmlunit 2.2.1 с Java и имею следующие XML-файлы для соответствия. Проблема здесь двоякая:Соответствующие вложенные элементы с разным порядковым номером и номером

  1. порядок не то же самое
  2. некоторые из численных значений может иметь замыкающие нули (например, 0.250000)

По этой причине ByNameAndTextRecSelector() не работает, потому что требует, чтобы все текстовые узлы были точными совпадениями, что здесь не так. Я уже реализовал DifferenceEvaluator, который позаботится о конечных нулях в числах. Но что я использую для выбора правильных элементов для сравнения?

XML 1:

<test> 
    <table> 
    <row> 
     <element> 
     <code>ALPHA</code> 
     <scale>0.25</scale> 
     </element> 
    </row> 
    <row> 
     <element> 
     <code>DELTA</code> 
     <scale>0.1</scale> 
     </element> 
    </row> 
    </table> 
</test> 

XML 2:

<test> 
    <table> 
    <row> 
     <element> 
     <code>DELTA</code> 
     <scale>0.1</scale> 
     </element> 
    </row> 
    <row> 
     <element> 
     <code>ALPHA</code> 
     <scale>0.2500000</scale> 
     </element> 
    </row> 
    </table> 
</test> 

ответ

1

ли code элемент достаточно, чтобы выбрать правильные узлы? Если да, то должен работать такой подход, как пример руководства пользователя https://github.com/xmlunit/user-guide/wiki/SelectingNodes#conditional-elementselectors.

ElementSelectors.conditionalBuilder() 
    .whenElementIsNamed("row").thenUse(ElementSelectors.byXPath("./element/code", ElementSelectors.byNameAndText)) 
    .elseUse(ElementSelectors.byName) 
    .build(); 

Это не поможет в отношении разных форматов чисел. Чтобы справиться с ними, вы должны переопределить DifferenceEvaluator и обнаружить узлы Text, которые хранят номера, анализировать их и отмечать различия как EQUAL, если они достаточно близки.

Если code не хватает, то вам нужно будет написать ElementSelector, который заботится о числах как DifferenceEvaluator я описал выше, и объединить, что с ElementSelectors.byNameAndText внутри выше условной.

+0

«код» недостаточно, мне также понадобится «шкала». Как мне совместить эти два? Я использую 'и' и помещаю это внутри' thenUse'? – Roland

+0

Это похоже на работу: 'и (byXPath (" ./ element/code ", byNameAndText), byXPath (" ./ element/scale ", новый SelectorByNameAndNumber()))' – Roland

+1

'и' должны были работать, если вы хотите чтобы они также были отделены друг от друга. Рад, что это сработало. –

Смежные вопросы