当前位置: 首页 > 知识库问答 >
问题:

xmlPath无法从xml中获取要列出的特定对象

拓拔坚
2023-03-14

我最近开始使用rest assured测试一些XML。下面是一个例子:

<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>

我想在这里实现的是,检查每次购物是否有一个容器号="8",然后检查每个容器是否有颜色="绿色"。这是代码


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”,然后检查这些类别是否都有label=“chocolate”,我收到一个空列表:


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

任何想法我错过了什么或解决方案应该是什么样子?非常感谢任何帮助。

共有2个答案

郜昊苍
2023-03-14

我设法找到了解决办法。首先,我想说明为什么你的建议没有让我满意。这是真的,例如,它可以工作,但如果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")));
    }

在这种情况下,测试仍然是通过的,即使不是在每一次购物中,我们都有

我设法弄明白的是,在列表上绘制购物地图,然后在循环中检查类别:

    @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"));
        }
    }

对于上面的例子,这个测试会像预期的那样失败,因为它会正确地检查在每个购物中是否有期望的类别和期望的属性。

西门奇希
2023-03-14

这只是猜测,但也许你需要一个。list()之后。类别

注意:你可能想调用变量容器...

 类似资料:
  • 我有一个XML文件,我想取两个值。以下是XML: 我想让我们说一下<代码> 这是我尝试过的代码,但它不起作用: 有人能给我一个工作的例子吗?我是Java和XML的新手。

  • 我使用最新的freemarker版本2.3.23我有列表,其中包含用户对象,用户对象很简单,只包含名称属性。我的ftl文件如下所示: 我的Java代码如下所示: 错误显示如下:

  • } 我想从这个json对象中获取值。 我在下面试过了,但没有成功。

  • 问题内容: 我有一个名为“ Test”的表,其中包含两个字段“ qnId”和“ Answers”。’qnId’存储一个uuid,’Answers’是一个jsonb数组,大致如下所示: 我该如何使用value来检索of的值。如何使用普通的SQL查询检索值 问题答案: 演示:db <>小提琴 您可以用来将数组元素扩展为每一行。之后,您可以使用运算符(文档)过滤正确的元素:

  • 我有一个XMLPath对象,我想为一些节点取属性名。例如, 对于这个XML,什么是XMLPath表达式来获取的属性? 我可以通过以下内容获取md:EntityDescriptor的entityID: 但是对于位置属性,我想得到 我得到的输出是,其他什么都没有。

  • 我有一个数据就像 我想使用ES6高阶函数获得每个对象的名称,而不使用for或foreach。 我尝试过和但不知道何时使用什么