使ってみよう! Windows Live SDK/API

第17回 Windows Live Application Based Storage API(2)

この記事を読むのに必要な時間:およそ 14 分

RootFoldersの表示

Feed形式のXMLを取得しWebページに表示してみましょう。TreeViewコントロールを使用して階層を表示します。最初にツリーの最上位ノードを「RootFolders」として,その直下にRootFoldersのフォルダを表示できるようにします。

ツリーのノードとなるTreeNodeクラスは,Webページ上に表示されるTextプロパティのほかに非表示のデータをValueプロパティに格納することができます。このValueプロパティにフォルダの場合はそのフォルダが持つコレクションを表すリソースへのURL文字列を設定しアプリケーションで利用することにします。

まずはツリーにRootFoldersを表示します。リソースへのパスはlidパラメータさえわかれば決定しますのでコードは次のようになります。Cookieに保存しておいたlidパラメータを使用してURL文字列を作り,TreeNodeオブジェクトのコンストラクタに渡しています。そして生成したTreeNodeオブジェクトをTreeVewに追加します。コードでは「folder.png」というフォルダを表す画像がDefault.aspxファイルと同階層に用意してあるものとします。

Protected Sub ResourceTreeView_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles ResourceTreeView.Load
    If Me.DelegateionToken <> "" AndAlso ResourceTreeView.Nodes.Count = 0 Then
        Dim rootNode As New TreeNode("RootFolders", _
                                     "https://cumulus.services.live.com/@C@" & Request.Cookies("lid").Value & "/AtomApplicationStorage/RootFolders", _
                                     "folder.png")
        ResourceTreeView.Nodes.Add(rootNode)
    End If
End Sub

Feed要素の取得

次にWindows LiveサービスへアクセスしてXMLを取得するメソッドを作ります。メソッドはURL文字列を引数に受け取りXmlDocumentオブジェクトを返すものとしました。コード内では先に作成したCreateNewRequestメソッドを使用しています。リソースのパスの指定に誤りなどがあるとWebException例外がスローされるため,その場合はメッセージを<exception>タグで囲ったXmlDocumentとして返すようにしています。

Protected Function RetrieveResource(ByVal path As String) As XmlDocument

    Dim document As New XmlDocument
    Dim request As HttpWebRequest = CreatedNewRequest(path, "GET")
    Try
        Using response As HttpWebResponse = DirectCast(request.GetResponse, HttpWebResponse), _
            reader As New System.IO.StreamReader(response.GetResponseStream, System.Text.Encoding.UTF8)
            document.LoadXml(reader.ReadToEnd)
        End Using
        Return document

    Catch webEx As WebException
        document.InnerXml = "<exception>" & webEx.Message & "</exception>"
        Return document
    End Try

End Function

ツリーノードクリック時の処理

TreeVewコントロールのノードを選択するとSelectedNodeChangedイベントが発生します。このイベントを使用して作成したRetrieveResourceメソッドを呼ぶようにします。

XMLの操作にはXPathを使います。また,名前空間の指定のためにXmlNamespaceManagerを使用します。まず,_Defaultクラスに次のように変数を追加します。

' Imports System.Xml
Protected NamespaceManager As XmlNamespaceManager

続いてPage_Initメソッドに次のコードを追加してインスタンスを生成します。

NamespaceManager = New XmlNamespaceManager(New NameTable)
NamespaceManager.AddNamespace("metadata", "http://schemas.microsoft.com/ado/2007/08/dataservices/metadata")
NamespaceManager.AddNamespace("photos", "http://dev.live.com/photos")
NamespaceManager.AddNamespace("atom", "http://www.w3.org/2005/Atom")
NamespaceManager.AddNamespace("appstorage", "http://dev.live.com/AppStorage")

今回作成するアプリケーションでは,これらすべての名前空間を利用していませんが,改良時などの利便性のために書いています。

以下のコードがSelectedNodeChangedイベント時の処理になります。

Protected Sub ResourceTreeView_SelectedNodeChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ResourceTreeView.SelectedNodeChanged
    Dim selectedNode As TreeNode = ResourceTreeView.SelectedNode

    ' 選択されているノード以下をクリア
    selectedNode.ChildNodes.Clear()

    ' Feed XMLの取得
    Dim document As XmlDocument = RetrieveResource(selectedNode.Value)
    ' エラーの場合そのメッセージを表示
    If document.SelectNodes("/exception").Count > 0 Then
        MessageLiteral.Text = document.SelectNodes("/exception").Item(0).InnerText
        Exit Sub
    End If

    ' <entry>要素の取得
    Dim nodeList As XmlNodeList = document.SelectNodes("/atom:feed/atom:entry", NamespaceManager)
    For Each node As XmlNode In nodeList
        ' <link>要素からリソースパスの取得
        Dim url As String
        url = node.SelectSingleNode("atom:link[@rel='related']", NamespaceManager).Attributes("href").Value

        ' パスの末尾が「Streams」の場合、rel="edit-media"の<link>要素のパスを取得
        If url.EndsWith("Streams") Then
            url = node.SelectSingleNode("atom:link[@rel='edit-media']", NamespaceManager).Attributes("href").Value
        End If

        ' <title>要素からアイテム名を取得
        Dim name As String = node.SelectSingleNode("atom:title", NamespaceManager).FirstChild.Value

        ' 子ノードの作成
        Dim child As New TreeNode(name, url)

        ' アイテムの種類に応じたアイコンを設定
        Select Case node.Attributes(0).Value
            Case "Folder"
                child.ImageUrl = "folder.png"
            Case "Document"
                child.ImageUrl = "document.png"
            Case "Photo"
                child.ImageUrl = "photo.png"
        End Select

        ' チェックボックスを表示
        child.ShowCheckBox = True
        child.Checked = False

        selectedNode.ChildNodes.Add(child)
    Next

    selectedNode.Expand()
End Sub

XMLの内容を解析しTreeNodeオブジェクトの各プロパティに値を設定しています。Valueプロパティには,フォルダの場合はコレクションへのパスを,画像・文書の場合はそのアイテムのバイナリデータへのパスを指定しています。フォルダ・画像・文書を表す画像は適当なものを用意してください。

ここまでで一度実行してみましょう。⁠Request Consent」をクリックしてサインインします。初期状態でもRootFoldersにふたつのフォルダがあるので「RootFolders」ノードをクリックするとその下にフォルダが表示されると思います図4⁠。

図4 RootFoldersのフォルダの表示

図4 RootFoldersのフォルダの表示

著者プロフィール

松江祐輔(まつえゆうすけ)

日本システムウエア株式会社 勤務。現在,ハードウェア設計・検証業務を担当。大学生・大学院生時代はベンチャー企業 有限会社ミレニアムシステムズにプログラマーとして従事。趣味はプログラミング。好きな言語はVisual Basic。Microsoft MVP for Windows Live Platform(Jul 2010 - Jun 2011),Windows Live(Jul 2011 - Jun 2013)。

URL:http://katamari.jp