lalla1 发表于 2015-9-25 10:38:07

使用Sharepoint 2007中的webservice操作列表

Sharepoint中提供了很多开箱即用的Web Service,使用这些web service我们可以进行远程调用, 在"web server extensions\12\ISAPI"(其通常位于C:\Program Files\Common Files\Microsoft Shared\web server extensions\12\ISAPI")之下的"Microsoft Shared"目录中有大部分Web Services的物理文件。用于管理中心工具的管理Web Service位于ADMISAPI文件夹中,其在管理中心控制台里是一个名为"_vti_adm"的虚拟目录。当你创建了一个SharePoint站点时,它将包含一个名为"_vti_bin"的虚拟目录,以指向这个位置。IIS不为子站点包含任何应用程序或虚拟目录,它们只是包含通过 SharePoint元数据和HttpModules实现的对_vti_bin虚拟目录的映射。当然web service支持的功能没有sharepoint的对象模型丰富,不过基本都有了,本文主要说下Lists.asmx中的一些常用功能。


下面是一些常用的功能,关于其中一些CAML的使用请参考这篇文章http://www.cnblogs.com/carysun/archive/2011/01/12/moss-caml.html
1.得到Lists对象

static SPListsWS.Lists GetSPListWS()
      {
            SPListsWS.Lists spListsWS = new SPListsWS.Lists();
            if (UrlListSite != null && UrlListSite.Length > 0)
            {
                spListsWS.Url = UrlListSite;
            }
            if (SPWSUsername != null && SPWSUsername.Length > 0)
            {
                spListsWS.Credentials = new System.Net.NetworkCredential(SPWSUsername, SPWSUserPassword, SPWSDomain);
            }
            else
                spListsWS.Credentials = System.Net.CredentialCache.DefaultCredentials;

            return spListsWS;
      }
2.得到列表ID
static string GetSPListID(SPListsWS.Lists spListsWS, string listName,
            ref bool sourceFieldFound, ref bool targetFieldFound)
      {
            string listID;
            XmlNode aNode;
            XmlNode GetListResult;
            IEnumerator ienum;

            GetListResult = spListsWS.GetList(listName);

            listID = GetListResult.Attributes["ID"].Value;

            return listID;
      }

3.得到列表的item,可以通过CAML进行条件筛选
       static XmlNode GetListItems(SPListsWS.Lists spListsWS)
      {
            string rowLimit = "1000000", xDocQueryString, xDocFieldsString;
            //string getAllRecordsQuery = "<Query><Where><Gt><FieldRef Name=\"ID\" /><Value Type=\"Counter\">-1</Value></Gt></Where></Query>";
            string getAllRecordsQuery = "<Query><Where><Eq><FieldRef Name=\"a\" /><Value Type=\"String\">Approved</Value></Eq></Where></Query>";
            XmlNode result = null;
            XmlDocument xDocQuery = null, xDocFields;

            xDocQueryString = ConfigurationManager.AppSettings["SPListItemQueryString"];
            if (xDocQueryString != null && xDocQueryString.Length > 0)
            {
                xDocQuery = new XmlDocument();
                xDocQuery.LoadXml(xDocQueryString);
            }
            else
            {
                xDocQuery = new XmlDocument();
                xDocQuery.LoadXml(getAllRecordsQuery);
            }

            xDocFieldsString = "<ViewFields><FieldRef Name=\"ID\"></FieldRef>" +
                "<FieldRef Name=\"" + SourceField + "\"></FieldRef>" +
                "<FieldRef Name=\"" + TargetField + "\"></FieldRef>" +
                "</ViewFields>";
            xDocFields = new XmlDocument();
            xDocFields.LoadXml(xDocFieldsString);

         // result = spListsWS.GetListItems(ListName, null, xDocQuery, xDocFields, rowLimit, null, null);
            result = spListsWS.GetListItems(ListName, null, null, null, rowLimit, null, null);

            return result;
      }
4.更新列表中的item,使用CAML的方式
static bool UpdateListItem(SPListsWS.Lists spListsWS, string strlistItemID, string newHistoryValue)
      {
            bool sucess = false;
            string strErrorCode = null;
            long lngErrorCode = -1;
            XmlDocument xDocSyncCmd = new XmlDocument();
            XmlNode xNodeResult;
            string updateCommand;

            updateCommand = "<Batch OnError=\"Continue\">" +
                "<Method ID=\"1\" Cmd=\"Update\">" +
                "<Field Name=\"ID\">" + strlistItemID + "</Field>" +
                "<Field Name=\"" + TargetField + "\">" + EscapeIllegalChars(newHistoryValue) + "</Field>" +
                "</Method>" +
                "</Batch>";

            xDocSyncCmd.LoadXml(updateCommand);
            xNodeResult = spListsWS.UpdateListItems(ListName, xDocSyncCmd);
            xNodeResult = xNodeResult.FirstChild;
            xNodeResult = xNodeResult.FirstChild;
            if (xNodeResult.Name == "ErrorCode")
            {
                strErrorCode = xNodeResult.InnerXml;
                if (long.TryParse(strErrorCode.Replace("0x",""), out lngErrorCode))
                {
                  if (lngErrorCode == 0)
                  {
                        sucess = true;
                  }
                }
            }

            return sucess;
      }



static void UpdateListItemsHistory(SPListsWS.Lists spListsWS, XmlNode listItems)
      {
            IEnumerator ienum;
            XmlNode current, xNodeCommentHistory, xNodeEditorHistory, xDataNode = null;
            XmlAttribute xAttribCommentHistory, xAttribRecordCount;
            string strlistItemID, currHistoryValue, newHistoryValue;

            ienum = listItems.GetEnumerator();
            while (ienum.MoveNext())
            {
                current = (XmlNode)ienum.Current;
                if (current.Name == "rs:data")
                {
                  xDataNode = current;
                  xAttribRecordCount = xDataNode.Attributes["ItemCount"];
                  if (xAttribRecordCount != null)
                        long.TryParse(xAttribRecordCount.Value, out TotalRecords);

                  break;
                }
            }

            ienum = xDataNode.GetEnumerator();
            while (ienum.MoveNext())
            {
                current = (XmlNode)ienum.Current;
                if (current.Name == "z:row")
                {
                  strlistItemID = current.Attributes["ows_ID"].Value;
                  xAttribCommentHistory = current.Attributes["ows_" + TargetField];
                  if (xAttribCommentHistory != null)
                        currHistoryValue = current.Attributes["ows_" + TargetField].Value;
                  else
                        currHistoryValue = "";
                  xNodeCommentHistory = spListsWS.GetVersionCollection(ListName, strlistItemID, SourceField);
                  xNodeEditorHistory = spListsWS.GetVersionCollection(ListName, strlistItemID, "Editor");
                  newHistoryValue = ConcatenateHistory(xNodeCommentHistory, xNodeEditorHistory);
                  if (currHistoryValue != newHistoryValue)
                  {
                        UpdateListItem(spListsWS, strlistItemID, newHistoryValue);
                  }
                }
            }
      }

基本这些是最常用的功能了
页: [1]
查看完整版本: 使用Sharepoint 2007中的webservice操作列表