如何使用XPath从SOAP响应中提取partref和risikonr的值?
用XPath提取SOAP响应中的
partref和risikonr值 没问题,XPath完全适合处理这个需求——不过你的SOAP响应带了命名空间,这是很多人踩坑的点,直接写标签名肯定找不到,我给你一步步说明怎么写:
核心前提:处理命名空间
先看你提供的SOAP片段里的命名空间绑定:
SOAP-ENV→http://schemas.xmlsoap.org/soap/envelope/e→urn:tryg:forsikring:tjenester:engasjementef→urn:gjensidige:forsikring:engasjement
不管用什么工具/语言执行XPath,都得先把这些前缀和对应的URI绑定好,不然XPath会识别不了带前缀的标签。
定位表达式
假设partref和risikonr是嵌套在ef:risikogruppe节点下(从你给的截断片段来看是这个层级),对应的XPath写法如下:
提取所有partref的值
//ef:risikogruppe/ef:partref/text()
提取所有risikonr的值
//ef:risikogruppe/ef:risikonr/text()
更精准的层级定位(避免匹配到其他同名节点)
如果想从根节点开始精准定位,避免全局匹配的风险,可以写全路径:
/SOAP-ENV:Envelope/SOAP-ENV:Body/e:HentRisikoOversiktResponse/ef:engasjementOversiktRisikoer/ef:risikogrupper/ef:risikogruppe/ef:partref/text()
(risikonr的精准路径只需要把最后一段换成ef:risikonr/text()就行)
小提示
//表示从当前节点往下递归查找所有匹配的元素,适合不确定具体层级的情况;/表示严格的层级父子关系,适合精准定位;text()用来提取元素的文本内容,如果需要获取元素本身(不是文本),去掉text()即可。
比如在Chrome开发者工具里测试的话,可以用这段代码(已经帮你绑定了命名空间):
document.evaluate('//ef:risikogruppe/ef:partref/text()', document, function(prefix) { switch(prefix) { case 'ef': return 'urn:gjensidige:forsikring:engasjement'; case 'e': return 'urn:tryg:forsikring:tjenester:engasjement'; case 'SOAP-ENV': return 'http://schemas.xmlsoap.org/soap/envelope/'; default: return null; } }, XPathResult.STRING_TYPE, null).stringValue;
内容的提问来源于stack exchange,提问作者Magnus Jensen
相关产品推荐
相关产品推荐

