Можно ли получить узлы XML всегда в виде массива, даже если он один? - PullRequest
1 голос
/ 24 октября 2019

Я тестирую веб-сервис SOAP с использованием каратэ. Один из методов заключается в том, что в зависимости от запроса ответ может возвращать одно или несколько совпадений. При преобразовании этого XML-ответа в JSON, если есть только один результат, он интерпретируется как объект, но если их больше, то это массив.

Есть ли способ сделать это для заданного пути, он всегда возвращается в виде массива?

Пример XML только с одним совпадением:

<matches>
    <product>...</product>
</matches

Результирующая структура JSON:

{ 
    matches: {
        product: ...,
    }
}

Пример XML с более чем однимmatch:

<matches>
    <product>...</product>
    <product>...</product>
    <product>...</product>
</matches

Результирующая структура JSON:

{ 
    matches: [
        { product: ... },
        { product: ... },
        { product: ... },
    ]
}

Глядя на документацию от get , он говорит:

Aудобство, которое поддерживает синтаксис get (но не форма $ short-cut), состоит в том, чтобы возвращать один элемент, если правая часть вычисляет результат в виде списка (например, массив JSON). Это полезно, потому что в тот момент, когда вы используете подстановочный знак [*] или поисковый фильтр в JsonPath (см. Следующий раздел), вы возвращаете массив - хотя обычно вас интересует только первый элемент.

Но я пытался и не получил его на работу. Я не знаю, так ли это, или есть лучший или рабочий.

1 Ответ

0 голосов
/ 24 октября 2019

К сожалению, нет - это действительно различие в том, как XML и JSON работают в каратэ. Так что вам придется сделать некоторую пользовательскую логику. Например:

* def temp = { foo: { bar: { a: 1 } } }
# * def temp = { foo: [{ bar: { a: 1 } }] }
* if (temp.foo.bar) karate.set('temp', '$.foo', [temp.foo])
* match temp == { foo: [{ bar: { a: 1 } }] }

Так что только 1 строка может «нормализовать» JSON, если вы уверены, что это всегда должен быть массив.

...