5.3.2 Cosminexus XML Processorを使用した受信メッセージの解析

受信したメッセージをXMLデータとして処理する場合は,Cosminexus XML Processorのオブジェクトに変換して解析する方法を推奨します。

SOAP通信基盤でXMLデータを埋め込んだSOAPメッセージを受信し,データを取り出す場合,次の手順で処理してください。

  1. Cosminexus XML Processorを利用し,Documentオブジェクトを作成します。
  2. 作成したDocumentオブジェクトのimportNodeメソッドで,受信したSAAJのデータを変換します。
  3. 取得したNodeオブジェクトを操作して,必要な要素を取得します。

受信メッセージを解析する場合のコーディング例を次に示します。

import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPMessage;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Sample3 {
   /**
    * 受信したSOAPMessageオブジェクト全体を,DOMのオブジェクトに変換する
    * @param doc 変換先のDocument (Cosminexus XML Processorで作成したもの)
    * @param msg 変換元のSOAPMessage(受信したもの)
    * @return    変換した要素
    */
   public Node sample(Document doc, SOAPMessage msg) {
       Node n = null;
       try {
           // SAAJのデータを,Cosminexus XML Processorにインポートする
           SOAPEnvelope env = msg.getSOAPPart().getEnvelope();
           n = doc.importNode(env, true);
       }
       catch (Exception e) {
           // 省略
       }
       return n;
   }
}

受信メッセージがSOAP Faultメッセージである場合も,DOMとして解析することができます。また,SOAPFaultインタフェースを利用して,faultStringなどにアクセスすることもできます。

SOAPFaultインタフェースを利用する場合でも,Detail要素以下にXMLデータを格納している場合は,Cosminexus XML Processorのオブジェクトに変換して解析してください。

SOAP Faultメッセージである受信メッセージを解析する場合のコーディング例を次に示します。

import javax.xml.soap.Detail;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPFault;
import javax.xml.soap.SOAPMessage;
import org.w3c.dom.Document;
import org.w3c.dom.Node;

public class Sample4 {
   /**
    * 受信したSOAPFaultのdetail要素をDOMのNodeオブジェクトに変換する。
    *
    * @param doc 変換先の Document (Cosminexus XML Processorで作成したもの)
    * @param msg 変換元の SOAPMessage (受信したもの)
    * @return    変換した要素
    */
   public Node sample(Document doc, SOAPMessage msg) {
       Node n = null;
       try {
           SOAPBody body = msg.getSOAPBody();
           if (body.hasFault()) {
               SOAPFault fault = body.getFault();
               // SOAPFaultのほかの要素(faultStringなど)にアクセスする
               String faultString = fault.getFaultString();
               // 省略

               // DetailだけはDOMとして取得する
               Detail detail = fault.getDetail();
               n = doc.importNode(detail, true);
           }
           else {
               // 省略
           }
       }
       catch (Exception e) {
           // 省略
       }
       return n;
   }
}