首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于过滤SOAP消息的JXPath

用于过滤SOAP消息的JXPath
EN

Stack Overflow用户
提问于 2011-10-20 20:40:39
回答 1查看 495关注 0票数 1

我正在尝试从SOAP响应中提取节点GoodEmail的值。似乎无论我怎么尝试,我总是得到一个org.apache.commons.jxpath.JXPathNotFoundException.

SOAP响应:

代码语言:javascript
复制
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
      <VerifyEmailResponse xmlns="http://ws.cdyne.com/">
         <VerifyEmailResult>
            <ResponseText>Invalid Email Address</ResponseText>
            <ResponseCode>0</ResponseCode>
            <LastMailServer/>
            <GoodEmail>false</GoodEmail>
         </VerifyEmailResult>
      </VerifyEmailResponse>
   </soap:Body>
</soap:Envelope>

Java代码:

代码语言:javascript
复制
String payload = message.getPayloadAsString(); //The SOAP response
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db =  dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(payload));

Document doc = db.parse(is);
JXPathContext context = JXPathContext.newContext(doc);
String jxpathReply = (String) context.getValue("//soap:Envelope/soap:Body/VerifyEmailResponse/VerifyEmailResult/GoodEmail");

在我看来,错误代码似乎表明xpath过滤器是错误的。我已经尝试了几种不同的方法,但都不能正确使用。我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-10-20 21:00:36

这是XPath中最常见的问题。搜索"xpath default namespace",你会找到很多好的答案。

一个简短的解释是,在XPath中,任何没有前缀的名称都被认为属于"no “。因此,如果我们想指定属于某个名称空间(包括默认名称空间)的元素的名称,则必须为这些名称加上前缀,并且指定的前缀必须(使用特定的XPath引擎API)与特定节点所在的名称空间的名称空间uri相关联。

因此,表达式可能如下所示的

代码语言:javascript
复制
/soap:Envelope/soap:Body/x:VerifyEmailResponse/x:VerifyEmailResult/x:GoodEmail

其中前缀"x"与名字空间"http://ws.cdyne.com/"相关联(通过“注册”该名字空间关联

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7836057

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档