匹配具有不同顺序和数字格式的嵌套元素

时间:2016-08-11 15:55:35

标签: java .net xml xmlunit xmlunit-2

我在Java中使用xmlunit 2.2.1并且要匹配以下XML。这里的问题有两个:

  1. 订单不一样
  2. 某些数值可能包含尾随零(例如0.250000
  3. 出于这个原因,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 个答案:

答案 0 :(得分: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结合使用在上述条件内。