【问题标题】:xmlPath Cannot get specific objects to list from xmlxmlPath 无法从 xml 中获取要列出的特定对象
【发布时间】:2020-01-30 02:32:58
【问题描述】:

我最近开始使用 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>

我想在这里实现的是,检查每次购物是否有一个容器编号 =“八”,然后检查每个容器是否有颜色 =“绿色”。代码如下:


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

我缺少什么或解决方案应该是什么样子的任何想法?非常感谢您的帮助。

【问题讨论】:

    标签: java xml rest-assured


    【解决方案1】:

    这是一个猜测,但也许您需要在.category 之后添加一个.list()

    附:您可能打算调用变量container...

    【讨论】:

    • 为了清楚起见,我将容器更改为容器,谢谢。的确,.list() 在类别返回列表后带有所需的对象,但没有达到预期的效果。它不会检查每个购物中是否有所需的类别。它会检查是否在所有购物中都有所需的类别。例如,如果我将&lt;category type="present" label="chocolate" /&gt; 从一个购物区中删除并转移到另一个购物区,则此解决方案的效果将是相同的。我正在寻找解决方案,此示例的效果会有所不同。
    【解决方案2】:

    我设法找到了解决方案。首先,我想说明为什么您的建议不让我满意。没错,它适用于显示的示例,但如果 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")));
        }
    

    在这种情况下,测试仍然通过,即使不是每次购物我们都有&lt;category type="present" label="chocolate" /&gt;

    我设法弄清楚的是在列表上映射购物,然后在 for 循环中检查类别:

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

    对于上面的示例,此测试将按预期失败,因为它会正确检查每次购物中是否存在具有所需属性的所需类别。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多