1

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フィルターであることを示唆しているようです。私はいくつかの異なる方法を試しましたが、正しく理解できません。私は何が間違っているのですか?

4

1 に答える 1

0

これはXPathで最もよくある質問です。検索する"xpath default namespace"と、多くの良い答えが見つかります。

簡単に説明すると、XPathでは、接頭辞のない名前は「名前空間なし」に属していると見なされます。したがって、ある名前空間(デフォルトの名前空間を含む)に属する要素の名前を指定する場合は、これらの名前にプレフィックス付け、指定したプレフィックスを(特定のXPathエンジンAPIを使用して)名前空間のnamespace-uriに関連付ける必要があります。 、特定のノードが存在します。

したがって、式は次のようになります

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

ここで、プレフィックス"x"は(この名前空間の関連付けを「登録」することによって)名前空間に関連付けられます"http://ws.cdyne.com/"

于 2011-10-20T13:00:35.640 に答える