SharePoint開發——利用CSOM逐級獲取O365中SharePoint網站的List內容

Justin-Liu發表於2016-03-18
部落格地址:http://blog.csdn.net/FoxDave

本文介紹如何利用SharePoint客戶端物件模型(.NET)逐級獲取Office 365網站中List的內容,僅僅是示例,沒有講究太多東西。

程式碼如下:

ClientContext ctx = new ClientContext("<your sharepoint site url>");
            ctx.Credentials = new SharePointOnlineCredentials("username", GetSecurePassword("password"));
            Web web = ctx.Web;
           
            List list = web.Lists.GetByTitle("List");
            ctx.Load(list, l => l.RootFolder, l => l.RootFolder.ServerRelativeUrl);
            ctx.ExecuteQuery();
            stringBuilder = RetrieveItems(ctx, list, list.RootFolder, 0);

            Console.WriteLine(stringBuilder.ToString());

首先第一部分是構建SharePoint Online的Context物件,授權認證那裡使用SharePointOnlineCredentials這個物件,這個物件建構函式的引數需要型別為字串的使用者名稱和型別為SecureString的密碼,這裡使用GetSecurePassword這個方法來構建密碼引數,程式碼將在下面列出。

第二部分,利用Context物件獲取指定的List,進而獲取裡面的內容。逐級獲取需要一個遞迴去實現,如上的RetrievevItems方法,同樣會在下面說明。

最後輸出獲取的內容,stringBuilder為全域性的StringBuilder物件,用來儲存讀取到的資訊。

GetSecurePassword方法的程式碼如下:

private static SecureString GetSecurePassword(string pwd)
        {
            //Get the user's password as a SecureString
            SecureString securePassword = new SecureString();
            char[] pwdArray = pwd.ToCharArray();
            for (int i = 0; i < pwdArray.Length; i++)
            {
                securePassword.AppendChar(pwdArray[i]);
            }
            return securePassword;
        }

方法的返回型別為SecureString。方法體中,首先構建一個SecureString物件,並將密碼字串轉成char陣列,然後執行AppendChar方法把依次將char陣列的字元傳入,最後返回這個物件就可以了。

RetrievevItems方法的程式碼如下:

private static StringBuilder RetrieveItems(ClientContext ctx, List list, Folder folder, int level)
        {
            level++;
            CamlQuery query = new CamlQuery();
            query.FolderServerRelativeUrl = folder.ServerRelativeUrl;
            ListItemCollection listItems = list.GetItems(query);
            ctx.Load(listItems);
            ctx.ExecuteQuery();
            foreach (ListItem item in listItems)
            {
                if (item.FileSystemObjectType == FileSystemObjectType.Folder)
                {
                    ctx.Load(item.Folder);
                    ctx.ExecuteQuery();
                    stringBuilder.AppendLine(string.Format("Level: {0}, Folder: {1}", level, item["Title"]));
                    return RetrieveItems(ctx, list, item.Folder, level);
                }
                else
                {
                    stringBuilder.AppendLine(string.Format("Level: {0}, Item: {1}", level, item["Title"]));
                }
            }
            return stringBuilder;
        }
引數level表示當前的深度。在使用客戶端物件模型獲取列表的Item時,需要傳入一個CamlQuery物件,為該物件的FolderServerRelativeUrl屬性賦值來控制要獲取Item的位置。然後對獲取到的當前級別的Item集合進行遍歷,如果存在資料夾,則進一步遍歷,通過這個遞迴方法進行了實現。

相關文章