XML
パーサーを利用することにより、
XML形式のデータを解析して、目的のデータを取り出すことができます。
XML(Extensible Markup Language)は環境にとらわれない非常に柔軟性の高い汎用的な規約となっています。
これにより、他のアプリケーションと
XMLファイルを通してデータのやりとりをスムーズに行うことができます。
3.8.1 XMLパーサーとデータの取得
intra-mart
の
APIとして提供されている
XMLパーサーを利用すると、XML 形式のデータを解析して
DOM(
Document Object Model)ツリー形式に変換します。
XMLの各タグやその中に記述されているデータを
DOMツ
リーオブジェクトから取得する事ができます。
※
XMLおよび
DOMツリーに関しては、W3C が規約を定めています。最新の情報に関しては
W3C
のホームページ等を参照してください。
※
XMLパーサーに関しては、W3C および SAX のホームページ上で最新の技術情報が 公開されています。
※ 詳細は、API リストの「アプリケーション共通モジュール」-「DOMXXX オブジェクト」、および、
「XMLParser オブジェクト」を参照してください。
3.8.2 XML形式データの受信方法
ここでは、簡単な例として、以下の
XML形式データを受信するアプリケーションを作成します。
<?xml version='1.0' encoding='UTF-8'?>
<account>
<user-id>ueda</user-id>
<name>上田</name>
<role>
<role-id sample-attr="サンプル属性">level1</role-id>
</role>
</account>
3.8.2.1 Request
オブジェクトを使用した
XML形式データの受信方法
Request
オブジェクトの
getParameter()、および、
getParameterValue()メソッドを利用することで、
XML
形式データの値を参照することができます(これにより、Adobe Flash Player などのリッチクライアントから 送信される
XML形式データを簡単に取り扱うことができます)。
Request#getParameter()の引数には、以下の形式に則ったパラメータ名を指定します。
XML
形式データの各タグ名をセパレータ「
/」で区切って指定する (ルートは「
/」)
属性値を取得する際は、属性名の前に「@」を付与する
Page 58 Copyright 2000-2013 株式会社NTTデータ イントラマート All rights Reserved.
<ファンクション・コンテナ(.js)の作成>
function init(request){
var userId = request.getParameterValue("/account/user-id");
var name = request.getParameterValue("/account/name");
var roleId = request.getParameterValue("/account/role/role-id");
var sampleAttr = request.getParameterValue("/account/role/role-id/@sample-attr");
Debug.browse(userId, name, roleId, sampleAttr);
}
※ この機能を利用するには以下の条件を満たしている必要があります。
リクエストのメソッドが「
POST」であること
リクエストの Content-Type エンティティヘッダフィールドが「text/xml」であること
リクエストのメッセージボディ部が構文解析可能な
XMLデータであること
3.8.2.2 XMLParserオブジェクトを使用した
XML形式データの受信方法
<ファンクション・コンテナ(.js)の作成>
function init(request){
//--- // メッセージボディを取得 //---
var messageBody = request.getMessageBody("UTF-8");
//--- // XML データの構文解析 //--- var xmlParser = new XMLParser();
var doc = xmlParser.parseString(messageBody);
if(xmlParser.isError()){
Debug.browse("エラーが発生しました。", xmlParser.getErrorMessage());
}
//--- // <user-id>, <name>, <role>ノード取得 //--- var childNodes = null;
var accountNode = doc.getDocumentElement();
var userIdNode = null;
var nameNode = null;
var roleNode = null;
childNodes = accountNode.getChildNodes();
for(var i = 0 ; i < childNodes.length ;i++) { if(childNodes[i].getTagName() == "user-id") { userIdNode = childNodes[i];
}
else if(childNodes[i].getTagName() == "name") { nameNode = childNodes[i];
}
else if(childNodes[i].getTagName() == "role") { roleNode = childNodes[i];
} }
//--- // <role-id>ノード取得
//--- var roleIdNode = null;
childNodes = roleNode.getChildNodes();
for(var i = 0 ; i < childNodes.length ;i++) {
作成者:株式会社 NTT データ イントラマート
Page 59 if(childNodes[i].getTagName() == "role-id") {roleIdNode = childNodes[i];
} }
//--- // <role-id>ノードの属性取得 //---
var roleIdAttr = roleIdNode.getAttribute("sample-attr");
//--- // 各ノードの値を表示
//---
Debug.browse(userIdNode.getChildNodes()[0].getValue(), nameNode.getChildNodes()[0].getValue(), roleIdNode.getChildNodes()[0].getValue(), roleIdAttr);
}
3.8.3 XML形式データの送信方法
一般的な
Webブラウザは、 受信したデータがどのような形式であるか を判定するた めに、レスポンスの
Content-Type
エンティティヘッダフィールドを利用します。サーバで作成した
XML形式のデータをクライアントに
送信するには、レスポンスの
Content-Typeエンティティヘッダフィールドに
"text/xml"を指定します。ここでは、簡 単な例として、以下の
XML形式データをクライアントに送信するアプリケーションを作成します。
<?xml version='1.0' encoding='UTF-8'?>
<account>
<user-id>ueda</user-id>
<name>上田</name>
<role>
<role-id sample-attr="サンプル属性">level1</role-id>
</role>
</account>
3.8.3.1 <IMART type="Content-Type">
タグを使用した
XML形式データの送信方法
<プレゼンテーション・ページ(.html)の作成>
<IMART type="Content-Type" value="text/xml; charset=UTF-8"></IMART>
<?xml version='1.0' encoding='UTF-8'?>
<IMART type="string" value=xmlString></IMART>
<ファンクション・コンテナ(.js)の作成>
var xmlString = "";
function init(request){
//--- // DOM ツリーを構築
//--- var doc = new XMLDocument("<account/>");
var accountNode = doc.getDocumentElement();
// エレメントを作成
var userIdNode = doc.createElement("user-id");
var nameNode = doc.createElement("name");
var roleNode = doc.createElement("role");
var roleIdNode = doc.createElement("role-id");
// テキストノードを作成
Page 60 Copyright 2000-2013 株式会社NTTデータ イントラマート All rights Reserved.
var userIdText = doc.createTextNode("ueda");
var nameText = doc.createTextNode("上田");
var roleIdText = doc.createTextNode("level1");
// 属性を設定
roleIdNode.setAttribute("sample-attr", "サンプル属性");
// 子ノードを追加
userIdNode.appendChild(userIdText);
nameNode.appendChild(nameText);
roleNode.appendChild(roleIdNode);
roleIdNode.appendChild(roleIdText);
accountNode.appendChild(userIdNode);
accountNode.appendChild(nameNode);
accountNode.appendChild(roleNode);
//--- // XML の文字列をバインド //--- xmlString = doc.getXmlString();
}
3.8.3.2 HTTPResponse
オブジェクトを使用した
XML形式データの送信方法
<ファンクション・コンテナ(.js)の作成>
function init(request){
//--- // DOM ツリーを構築
//--- var doc = new XMLDocument("<account/>");
var accountNode = doc.getDocumentElement();
// エレメントを作成
var userIdNode = doc.createElement("user-id");
var nameNode = doc.createElement("name");
var roleNode = doc.createElement("role");
var roleIdNode = doc.createElement("role-id");
// テキストノードを作成
var userIdText = doc.createTextNode("ueda");
var nameText = doc.createTextNode("上田");
var roleIdText = doc.createTextNode("level1");
// 属性を設定
roleIdNode.setAttribute("sample-attr", "サンプル属性");
// 子ノードを追加
userIdNode.appendChild(userIdText);
nameNode.appendChild(nameText);
roleNode.appendChild(roleIdNode);
roleIdNode.appendChild(roleIdText);
accountNode.appendChild(userIdNode);
accountNode.appendChild(nameNode);
accountNode.appendChild(roleNode);
//--- // XML の文字列をバインド //--- var encoding = "UTF-8";
var xmlString = "<?xml version='1.0' encoding='" + encoding + "'?>" + doc.getXmlString();
作成者:株式会社 NTT データ イントラマート
Page 61 //---// Content-Type を設定
//--- var response = Web.getHTTPResponse();
response.setContentType("text/xml; charset=" + encoding);
//--- // データ送信
//--- response.sendMessageBodyString(xmlString);
}
Page 62 Copyright 2000-2013 株式会社NTTデータ イントラマート All rights Reserved.