• 検索結果がありません。

XML形式のデータを扱う

ドキュメント内 intra-mart WebPlatform/AppFramework (ページ 65-70)

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.

ドキュメント内 intra-mart WebPlatform/AppFramework (ページ 65-70)