登録メッセージまたは登録解除メッセージに応答して CRNP サーバーが送信する SC_REPLY XML XML メッセージを解析するには、RegReply ヘルパークラスが必要です。このクラスは、XML ドキュメントから構築できます。このクラスは、ステータスコードとステータスメッセージのアクセッサを提供します。サーバーからの XML ストリームを解析するには、新しい XML ドキュメントを作成してそのドキュメントの解析メソッドを使用する必要がありますこのメソッドの詳細は、http://java.sun.com/xml/jaxp/index.html の JAXP ドキュメントに記載されています。
上記のロジックを実装する Java コードを作成します。
readRegistrationReply メソッドは、新しい RegReply クラスを使用します。
private void readRegistrationReply(InputStream stream) throws Exception { // ドキュメントビルダーを作成する。 DocumentBuilder db = dbf.newDocumentBuilder(); db.setErrorHandler(new DefaultHandler()); // 入力ファイルを解析する。 Document doc = db.parse(stream); RegReply reply = new RegReply(doc); reply.print(System.out); }
RegReply クラスを実装します。
retrieveValues メソッドは XML ドキュメント内の DOM ツリーを回り、ステータスコードとステータスメッセージを抽出します。詳細は、http://java.sun.com/xml/jaxp/index.html の JAXP ドキュメントに記載されています。
class RegReply { public RegReply(Document doc) { retrieveValues(doc); } public String getStatusCode() { return (statusCode); } public String getStatusMsg() { return (statusMsg); } public void print(PrintStream out) { out.println(statusCode + ": " + (statusMsg != null ? statusMsg : "")); } private void retrieveValues(Document doc) { Node n; NodeList nl; String nodeName; // SC_REPLY 要素を見つける nl = doc.getElementsByTagName("SC_REPLY"); if (nl.getLength() != 1) { System.out.println("Error in parsing: can't find " + "SC_REPLY node."); return; } n = nl.item(0); // statusCode 属性の値を取得する。 statusCode = ((Element)n).getAttribute("STATUS_CODE"); // SC_STATUS_MSG 要素を検出する nl = ((Element)n).getElementsByTagName("SC_STATUS_MSG"); if (nl.getLength() != 1) { System.out.println("Error in parsing: can't find " + "SC_STATUS_MSG node."); return; } // TEXT セクションを取得する (存在する場合)。 n = nl.item(0).getFirstChild(); if (n == null || n.getNodeType() != Node.TEXT_NODE) { // 1 つも存在しなくてもエラーではないため、そのまま戻る。 return; } // 値を取得する。 statusMsg = n.getNodeValue(); } private String statusCode; private String statusMsg; }