在 GPath groovy 语句中使用 AND 子句获取所有 xml 节点匹配 >1 个条件
Using AND clause in a GPath groovy statement to get all xml nodes matching >1 criteria
我是 Groovy / GPath 的新手,正在将它与 RestAssured 一起使用。我需要一些有关查询语法的帮助。
给定以下 xml 片段:
<?xml version="1.0" encoding="UTF-8"?>
<SeatOptions FlightNumber="GST4747" AircraftType="737" NumberOfBlocks="2" Currency="GBP" Supplier="ABC">
<Seat Num="1A" Availabile="true" BandId="1" Block="1" Row="1" AllowChild="false" />
<Seat Num="1B" Availabile="true" BandId="1" Block="1" Row="1" AllowChild="false" />
<Seat Num="1C" Availabile="true" BandId="1" Block="1" Row="1" AllowChild="false"/>
<Seat Num="1D" Availabile="true" BandId="1" Block="2" Row="1" AllowChild="false" />
<Seat Num="1E" Availabile="true" BandId="1" Block="2" Row="1" AllowChild="true" />
<Seat Num="1F" Availabile="true" BandId="1" Block="2" Row="1" AllowChild="true" />
</SeatOptions>
我可以提取所有座位号如下:
List<String> allSeatNos = response.extract().xmlPath().getList("**.findAll { it.name() == 'Seat'}.@Num");
如何提取 AllowChild="true" 中的所有座位号?
我试过:
List<String> childSeatNos = response.extract().xmlPath().getList("**.findAll { it.name() == 'Seat' & it.@AllowChild() == 'true'}.@Num");
它抛出:
java.lang.IllegalArgumentException: Path '**'.findAll { it.name() == 'Seat' & it.@AllowChild() == 'true'}.'@Num' is invalid.
正确的语法是什么?
对逻辑 AND
运算符使用 &&
,而不是单个 &
,后者是按位 "and" 运算符。同时将你的表达方式改为:
response."**".findAll { it.name() == 'Seat' && it.@AllowChild == 'true'}*.@Num
- 使用
it.@AllowChild
来引用字段(不是it.@AllowChild()
)
- 使用扩展运算符
*.@Num
将 Num
字段提取到列表中(不是 .@Num
)
以下代码:
List<String> childSeatNos = response.extract()
.xmlPath()
.getList("response."**".findAll { it.name() == 'Seat' && it.@AllowChild == 'true'}*.@Num");
生成列表:
[1E, 1F]
我是 Groovy / GPath 的新手,正在将它与 RestAssured 一起使用。我需要一些有关查询语法的帮助。
给定以下 xml 片段:
<?xml version="1.0" encoding="UTF-8"?>
<SeatOptions FlightNumber="GST4747" AircraftType="737" NumberOfBlocks="2" Currency="GBP" Supplier="ABC">
<Seat Num="1A" Availabile="true" BandId="1" Block="1" Row="1" AllowChild="false" />
<Seat Num="1B" Availabile="true" BandId="1" Block="1" Row="1" AllowChild="false" />
<Seat Num="1C" Availabile="true" BandId="1" Block="1" Row="1" AllowChild="false"/>
<Seat Num="1D" Availabile="true" BandId="1" Block="2" Row="1" AllowChild="false" />
<Seat Num="1E" Availabile="true" BandId="1" Block="2" Row="1" AllowChild="true" />
<Seat Num="1F" Availabile="true" BandId="1" Block="2" Row="1" AllowChild="true" />
</SeatOptions>
我可以提取所有座位号如下:
List<String> allSeatNos = response.extract().xmlPath().getList("**.findAll { it.name() == 'Seat'}.@Num");
如何提取 AllowChild="true" 中的所有座位号?
我试过:
List<String> childSeatNos = response.extract().xmlPath().getList("**.findAll { it.name() == 'Seat' & it.@AllowChild() == 'true'}.@Num");
它抛出:
java.lang.IllegalArgumentException: Path '**'.findAll { it.name() == 'Seat' & it.@AllowChild() == 'true'}.'@Num' is invalid.
正确的语法是什么?
对逻辑 AND
运算符使用 &&
,而不是单个 &
,后者是按位 "and" 运算符。同时将你的表达方式改为:
response."**".findAll { it.name() == 'Seat' && it.@AllowChild == 'true'}*.@Num
- 使用
it.@AllowChild
来引用字段(不是it.@AllowChild()
) - 使用扩展运算符
*.@Num
将Num
字段提取到列表中(不是.@Num
)
以下代码:
List<String> childSeatNos = response.extract()
.xmlPath()
.getList("response."**".findAll { it.name() == 'Seat' && it.@AllowChild == 'true'}*.@Num");
生成列表:
[1E, 1F]