JXPath для фильтрации сообщений SOAP - PullRequest
1 голос
/ 20 октября 2011

Я пытаюсь извлечь значение узла GoodEmail из ответа SOAP.Кажется, что независимо от того, что я пытаюсь, я всегда получаю 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 голосов
/ 20 октября 2011

Это наиболее часто задаваемые вопросы в XPath .Ищите "xpath default namespace", и вы найдете много хороших ответов.

Краткое объяснение состоит в том, что в XPath любое имя без префикса считается принадлежащим "пространству имен".Поэтому, если мы хотим указать имена элементов, которые принадлежат некоторому пространству имен (включая пространство имен по умолчанию), эти имена должны иметь префикс, и указанный префикс должен быть связан (используя определенный API механизма XPath) сnamespace-uri пространства имен, в котором находится конкретный узел.

Следовательно, выражение может выглядеть примерно так: :

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

, где префикс "x" ассоциируется («регистрируя» эту ассоциацию пространства имен) с пространством имен "http://ws.cdyne.com/"

...