logo

サイト内検索
ココログ最強検索 by 暴想

最近のトラックバック

無料ブログはココログ

« ブログ「顧きゃく録」技術ノート リニューアル スタート | トップページ | Apex正規表現はJavaと"大体"同じだよ »

Force.comのSites機能を使用してXMLファイルを出力する

実は「顧きゃく録」ではSites機能を使用して、siteMap.xmlファイルを生成する機能を持っています。

その際に使用したSites機能を使用してXMLファイルを出力するテクニックの例です。

[サンプルプログラム:SampleByXml]

1.仕様
以下のようなユーザーIDを含むリクエストURLに対して、特定のユーザーの所有するカスタムオブジェクトのリストをXMLにて返す。
1.1.リクエストURL
http://サイトのURL/SampleByXml?ownerid=ユーザーのID
例:

http://kdbmiuratest-developer-edition.na11.force.com/SampleByXml?ownerid=005A0000000tlF2

↑実際にこのURLで稼動します。

1.2.レスポンスXML

タグ名:内容

items:カスタムオブジェクトのリスト
 item:個々のオブジェクト
  フィールド名:値

例:

<items>
<item>
<id>a04A00000044Te7IAE</id>
<name>井村屋あんまん</name>
<price__c>120</price__c>
</item>
<item>
<id>a04A00000044TYeIAM</id>
<name>井村屋にくまん</name>
<price__c>120</price__c>
</item>
<item>
<id>a04A00000044TcMIAU</id>
<name>三色団子</name>
<price__c>110</price__c>
</item>
</items>

2.ソースコード

[Visualforceページ]

<apex:page controller="SampleByXml" showHeader="false"
sidebar="false" contentType="text/xml">
    <apex:outputText escape="false" value="{!xml}"/>
</apex:page>

[コントローラークラス]

public with sharing class SampleByXml {

    public String getXml() {
        String oid = system.currentPageReference().getParameters().get('ownerid');
        String wfnms = 'id,name,' +  getCustomFieldsNames(Item__c.SObjecttype);
        Item__c[] itms = Database.query('select ' + wfnms + ' from Item__c where ownerId=\'' + oid + '\'');
        DOM.Document doc = new DOM.Document();
        dom.XmlNode items
            = doc.createRootElement('items', null, null);
        //フィールド名の配列   
        String[] fnms = wfnms.split(',');
        for(Item__c itm:itms){
                dom.XmlNode itemNode
                = items.addChildElement('item', null, null);
                for(String fnm:fnms){
                        dom.XmlNode fldNode
                        = itemNode.addChildElement(fnm, null, null);
                        fldNode.addTextNode(itm.get(fnm) + '');
                }      
        }
        system.debug(doc.toXmlString());
        return doc.toXmlString();
    }
   

        //SOQL発行用にSObjectのカスタムフィールドのカンマ区切りのリストを作る
        public static String getCustomFieldsNames(Schema.SObjecttype tp){
                String res = '';
                Map<String,Schema.sObjectField> fmap = tp.getDescribe().fields.getMap();
                for(String fn:fmap.keySet()){
                        if(fn.endswith('__c')){
                                res = res + fn + ',';
                        }
                }
                return res.substring(0,res.length()-1);
        }

}

3.解説
Visualforceページではapex:outputTextを使用して{!xml}でgetXmlの戻りを出しているだけです。ただしescape="false"を指定します。apex:page タグではヘッダー、サイドバーを無効にして、contentType="text/xml"を指定するところがミソです。
コントローラークラスではリクエストパラメーターからowneridを取り、DBをその条件で読んで、DOM.Documentおよびdom.XmlNodeを使用してXMLに組み上げます。今回は当社の研修で使用したItem__cというカスタムオブジェクトを使用しています。
なお、getCustomFieldsNamesメソッド以下は、任意のカスタムオブジェクトのカスタムフィールド名を入手するために当社で使用しているユーティリティメソッドですので本題と特に関係はありません。
いかかでしょうか?

P.S.getCustomFieldsNamesメソッドに関しては、別記事に書きました。

- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * -
     ネットのパワーを不動産業へ生かす!
     不動産業向け顧客管理・営業支援システム  顧きゃく録!
- * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - * - *

« ブログ「顧きゃく録」技術ノート リニューアル スタート | トップページ | Apex正規表現はJavaと"大体"同じだよ »

Force.com」カテゴリの記事

Salesforce」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1482716/40128960

この記事へのトラックバック一覧です: Force.comのSites機能を使用してXMLファイルを出力する:

« ブログ「顧きゃく録」技術ノート リニューアル スタート | トップページ | Apex正規表現はJavaと"大体"同じだよ »