5.3.2 XML Processorを使用した受信メッセージの解析
受信したメッセージをXMLデータとして処理する場合は,XML Processorのオブジェクトに変換して解析する方法を推奨します。
SOAP通信基盤でXMLデータを埋め込んだSOAPメッセージを受信し,データを取り出す場合,次の手順で処理してください。
-
XML Processorを利用し,Documentオブジェクトを作成します。
-
作成したDocumentオブジェクトのimportNodeメソッドで,受信したSAAJのデータを変換します。
-
取得した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; } }