XPath用于解析SOAP响应

3

以下是SOAP响应,我该如何使用XPATH对响应内容进行测试/验证?注意:我在使用RunScope测试我们的API。

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetValidDataExtractResponse xmlns="http://some.namespace">
<GetValidDataForExtractResult>
<long>1001</long>
<long>1002</long>
  </GetValidDataForExtractResult>
</GetValidDataExtractResponse>
</soap:Body>
</soap:Envelope>

我可以通过使用以下方法得到一个有效值:/soap:Envelope/soap:Body 但是,这无法让我更深入地了解“主体中是否存在某些内容”。 我希望能够确定“GetValidDataExtractResponse”节点是否包含任何内容,还希望确定“etValidRentalUnitIdsForExtractResult”节点是否包含X个项目或该节点是否包含特定值。

与论坛网站不同,我们在 [so] 上不使用“谢谢”、“感激任何帮助”或签名。请参阅“应该从帖子中删除‘Hi’、‘thanks’、标语和问候语吗? - John Saunders
对我而言,SO 最好的一点是人们不会像其他论坛那样经常告诉我我做错了什么。但还是谢谢你提醒我。 - coach_rob
2个回答

1
您可以使用parent[child]来检查子节点是否存在。因此,以下是一些想法,假设您已经为http://some.namespace设置了一个命名空间别名x,并且您在关闭标签中打了一个错别字:
  • "查找具有GetValidDataForExtractResult子节点的GetValidDataExtractResponse

x:GetValidDataExtractResponse[x:GetValidDataForExtractResult]
  • “查找具有恰好两个long子元素的GetValidDataForExtractResult”:

x:GetValidDataForExtractResult[count(x:long)=2]
  • 查找包含一个名为GetValidDataForExtractResult的元素,该元素拥有一个子元素使用long类型,且其文本值为'1001'

x:GetValidDataForExtractResult[x:long/text()='1001']

我个人不使用RunScope,但我想它应该有一种方法来测试xpath节点选择是否返回零个节点(或对于单个节点选择的空元素)。

这看起来非常有前途。请告诉我如何设置别名。 - coach_rob
@coach_rob 您不需要为属于默认命名空间的元素添加前缀,只需在XPath查询中使用元素名称即可。 - Darrel Miller
@coach_rob 计数运算符不能在属性名称中使用。您可以使用基于脚本的断言来进行更复杂的测试。请参见https://www.runscope.com/docs/radar/scripts,我们在脚本中启用此https://code.google.com/p/marknote/wiki/DevelopersGuide XML解析器。 - Darrel Miller
@DarrelMiller - 我正在尝试使用以下内容设置名为“IdsList”的变量:/soap:Envelope/soap:Body/GetValidDataExtractResponse/GetValidDataExtractResult,但RunScope无法解析。我是否错误地阅读了您的第一次回复? - coach_rob
尝试使用不受命名空间限制的语法。如果这样可行://*[local-name()='GetValidDataExtractResponse/GetValidDataExtractResult'],那么我非常确信你需要适应命名空间——GetValidDataExtractResponse等不在全局命名空间中,而是在xmlns="http://some.namespace"中。 - StuartLC
@coach_rob 您的样本数据对我也不起作用。我明天会与团队一起研究这个问题。 - Darrel Miller

1

好的,这不太美观,但可能对您有用。使用Runscope测试中的脚本功能,您可以从正文中提取值。以下是一个示例,提取第一个“long”值。

var parser = new marknote.Parser();
var doc = parser.parse(response.body);

var envelope = doc.getRootElement();
var body = envelope.getChildElement("soap:Body");
var resp = body.getChildElement("GetValidDataExtractResponse");
var result = resp.getChildElement("GetValidDataForExtractResult");
var long = result.getChildElement("long");
variables.set("id", long.getText());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接