Hitachi

Cosminexus V11 アプリケーションサーバ SOAPアプリケーション開発の手引


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

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

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

  1. 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 (XML Processorで作成したもの)
     * @param msg 変換元のSOAPMessage(受信したもの)
     * @return    変換した要素
     */
    public Node sample(Document doc, SOAPMessage msg) {
        Node n = null;
        try {
            // SAAJのデータを,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データを格納している場合は,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 (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;
    }
}