JXPath过滤SOAP消息

时间:2011-10-20 12:40:39

标签: java soap xpath jxpath

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

SOAP响应:

<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代码:

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过滤器。我尝试了一些不同的,但无法做到正确。我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

简要说明是在XPath中,任何未加前缀的名称都被视为属于“无名称空间”。因此,如果我们要指定属于某个命名空间的元素的名称(包括默认的namesopace),那么这些名称​​必须作为前缀,并且必须关联指定的前缀(使用特定的XPath引擎API)使用命名空间的namespace-uri,特定节点所在的位置。

因此,表达式可能是这样的

/soap:Envelope/soap:Body/x:VerifyEmailResponse/x:VerifyEmailResult/x:GoodEmail

其中前缀"x"与命名空间"http://ws.cdyne.com/"

相关联(通过“注册”此命名空间关联)