用于解析SOAP响应的XPath

时间:2014-10-29 18:46:04

标签: xml xpath runscope

鉴于以下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个项目或该节点包含某些值。

2 个答案:

答案 0 :(得分:1)

您可以检查子节点是否存在parent[child]。所以这里有一些想法,假设您为x设置了名称空间别名http://some.namespace,并且您在结束标记中输入了拼写错误):

  • &#34;与GetValidDataExtractResponse孩子一起查找GetValidDataForExtractResult&#34;:

x:GetValidDataExtractResponse[x:GetValidDataForExtractResult]
  • &#34;只与两个GetValidDataForExtractResult孩子一起查找long&#34;:

x:GetValidDataForExtractResult[count(x:long)=2]
  • 找到GetValidDataForExtractResultlong孩子一起使用&#39; 1001&#39;作为文本值

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

我不会亲自使用RunScope,但我认为它有办法测试xpath节点选择是否返回零节点(或单个节点选择的null元素)。

答案 1 :(得分:1)

好的,这不是很好,但它可能对你有用。使用Runscope测试中的脚本功能,您可以从正文中提取值。这是一个提取第一个&#34; long&#34;值。

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