xmlPath Не удается получить конкретные объекты для списка из XML - PullRequest
2 голосов
/ 30 сентября 2019

Я недавно начал использовать успокоенный, чтобы проверить некоторые xmls. Вот пример:

<activity>
    <shopping>
        <category type="groceries" label="chocolate" />
        <category type="groceries" label="chocolate" />
        <category type="present" label="chocolate" />
        <container number="eight" color="green" />
    </shopping>
    <shopping>
        <category type="groceries" label="chocolate" />
        <category type="groceries" label="chocolate" />
        <category type="present" label="chocolate" />
        <container number="eight" color="green" />
    </shopping>
    <shopping>
        <category type="groceries" label="chocolate" />
        <category type="groceries" label="chocolate" />
        <category type="present" label="chocolate" />
        <container number="eight" color="green" />
    </shopping>
</activity>

Я хотел бы добиться здесь, проверить, есть ли для каждой покупки номер контейнера = «восемь», а затем проверить, имеет ли каждый контейнер цвет = «зеленый». Вот код:


assertThat(xmlPath.getList("activity.shopping.list().container.findAll{it.@number == 'eight'}.@color", String.class), everyItem(equalTo("green")));

это прекрасно работает, когда я отлаживаю это, я получаю именно то, что хотел достичь:


        List <String> lista = xmlPath.getList("activity.shopping.list().container.findAll{it.@number == 'eight'}.@color", String.class);

Это список из трех элементов, где каждыйэлемент равен «зелёному».

Но когда я пытаюсь проверить, есть ли для каждого шоппинга категория type = "present", а затем проверить, имеет ли каждая из этих категорий метку = "chocolate", я получаюпустой список:


        List <String> lista2 = xmlPath.getList("activity.shopping.list().category.findAll{it.@type == 'present'}.@label", String.class);

Есть идеи, что мне не хватает или как должно выглядеть решение? Большое спасибо за любую помощь.

Ответы [ 2 ]

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

Мне удалось найти решение. Прежде всего я хочу показать, почему ваши предложения не удовлетворили меня. Это правда, что это будет работать для показанного примера, но если xml будет выглядеть так, он не справится с работой.

<activity>
    <shopping>
        <category type="groceries" label="chocolate" />
        <category type="groceries" label="chocolate" />
        <container number="eight" color="green" />
    </shopping>
    <shopping>
        <category type="groceries" label="chocolate" />
        <category type="groceries" label="chocolate" />
        <category type="present" label="chocolate" />
        <category type="present" label="chocolate" />
        <container number="eight" color="green" />
    </shopping>
    <shopping>
        <category type="groceries" label="chocolate" />
        <category type="groceries" label="chocolate" />
        <category type="present" label="chocolate" />
        <container number="eight" color="green" />
    </shopping>
</activity>
    @Test
    public void test3() {
        final XmlPath xmlPath = new XmlPath(TestXML2);
        assertThat(xmlPath.getList("activity.shopping.category.findAll{it.@type == 'present'}.@label", String.class), everyItem(equalTo("chocolate")));
    }

в этом случае тест все еще проходит, даже если в непри каждом посещении магазина <category type="present" label="chocolate" />

мне удалось выяснить, как сопоставить покупки в списке, а затем проверить категории в цикле:

    @Test
    public void test4(){
        List<Node> shoppings = new XmlPath(TestXML2).getList("activity.shopping.list()");
        for (Node categories : shoppings) {
            String val  = categories.getPath("category.findAll{it.@type == 'present'}.@label");
            assertThat(val, equalTo("chocolate"));
        }
    }

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

0 голосов
/ 30 сентября 2019

Это предположение, но, возможно, вам нужен .list() после .category?

PS Вы, вероятно, хотели вызвать переменную container ...

...