JUnit Проверьте, отсортирован ли XML-документ по произвольному столбцу

Учитывая XML-документ, например

<root>
  <row>
    <a>2</a>
    <b>1</b>
    <c>8</c>
  </row>
  <row>
    <b>5</b>
    <a>2</a>
    <c>8</c>
  </row>
  <row>
    <a>2</a>
    <c>8</c>
    <b>6</b>
  </row>
</root>

Есть ли простой способ утверждать, что XML-документ отсортирован по элементу B в XMLUnit?

Редактировать: у меня есть странная проблема с частью программного обеспечения, которое я не могу изменить, где значения тегов XML в любом заданном узле должны быть в определенном порядке. Я бы хотел, чтобы моя тестовая система применяла этот набор правил перед любой другой проверкой.


person sal    schedule 26.04.2010    source источник
comment
Я не могу придумать ни одного (но опять же, я не знаю XmlUnit и др.). почему ты хочешь сделать это? Является ли это результатом какого-либо метода, который нужно протестировать? Можете ли вы реорганизовать код, чтобы получить вывод в более удобном для тестирования формате?   -  person Péter Török    schedule 27.04.2010
comment
@Peter, я имею дело с устаревшим программным обеспечением, где XML должен быть в необычном формате. Я хотел бы убедиться, что мой вывод xml всегда подчиняется этим причудливым правилам.   -  person sal    schedule 27.04.2010
comment
Хороший вопрос (+1). Смотрите мой ответ для очень простого решения. :)   -  person Dimitre Novatchev    schedule 27.04.2010


Ответы (3)


Используйте значение следующего простого выражения XPath 1.0:

not(//b[. > following::b])

person Dimitre Novatchev    schedule 27.04.2010
comment
Это почти то, что я хотел. Я получил свое решение после просмотра этого. Спасибо! - person sal; 27.04.2010
comment
Привет, Сал, какое у тебя решение? - person belwood; 03.09.2010
comment
@belwood: @sal говорит, что он поместил это выражение XPath в свой код - вероятно, настоящие имена столбцов были другими. Если у вас такая же проблема, этот ответ должен помочь вам. - person Dimitre Novatchev; 03.09.2010

Вы можете построить утверждение вокруг выбора XPath.

Вероятно, самым простым способом было бы использовать выражение XPath /root/row/b, запросить тип результата NODESET, а затем скопировать текст из каждого узла результата в структуру List. Вы можете утверждать, что текст в этом списке равен «ожидаемому» списку, созданному с помощью метода Arrays.asList() (я предполагаю, что вы используете Java).

person Anon    schedule 26.04.2010
comment
Это было то, что я делал, и я не был доволен этим. Во-первых, было слишком много кода, относящегося к конкретному тесту, и еще больше кода, который, возможно, придется изменить по мере изменения моего кода. - person sal; 27.04.2010

Если вы можете выполнить XQuery, то утверждение XQuery:

every $i in (1 to count ($x/row) - 1)
satisfies 
   let $j :=  $i + 1   
   return number($x/row[$i]/b) <= number($x/row[$j]/b)

где $x — документ, имеет значение true, если строки расположены в порядке возрастания b, в противном случае — false.

person Chris Wallace    schedule 27.04.2010
comment
Я слишком молод, чтобы комментировать аккуратный ответ Дмитрия, но разве он не должен быть не($x//b[number(.) › следующий::b/number(.)]) для этих числовых данных и разве это не O N^ 2, так как каждое b сравнивается со всеми последующими b? - person Chris Wallace; 27.04.2010