如何使用Web服务更新Sharepoint上已上传文档的属性?

8
我正在尝试更新/编辑Sharepoint 2007上已上传文档的属性。
我的代码:
 Lists listService = new Lists();
 listService.PreAuthenticate = true;
 listService.Credentials = new NetworkCredential(username,password);
 listService.Url = "http://myserver/SiteName/_vti_bin/lists.asmx";

 string strBatch =

                   "<Method ID='1' Cmd='Update'> "
                   + " <Field Name='ID'>3</Field> "
                   + " <Field Name='Name'>Preeti</Field> "                 
                   + " </Method> ";

 XmlDocument xmlDoc = new System.Xml.XmlDocument();
 System.Xml.XmlElement elBatch = xmlDoc.CreateElement("Batch");
 elBatch.SetAttribute("OnError", "Continue");

elBatch.SetAttributeNode("UserName", "Preeti");
elBatch.InnerXml = strBatch;
XmlNode ndReturn = listService.UpdateListItems(ListName, elBatch);

MessageBox.Show(ndReturn.OuterXml); 

参考链接:链接
出现错误:“一个或多个字段类型未正确安装。请转到列表设置页面删除这些字段”。
3个回答

1

以下解决方案来自:http://www.codeproject.com/KB/sharepoint/File_Shunter.aspx

请注意,如其他答案所述,字段的内部名称是必需的。

Web.Config Keys

如果您选择这样做,可以将以下内容添加到应用程序的 Web.config 中(仅针对此示例,或者您可以在代码中直接包含所需的值[服务器、文档库、用户、域、密码等]):

<configuration>
<appSettings>

<add key="SharePointServer" value=http://SP Portal/Site/>
<add key="DocLibrary" value="Doclib"/>
<add key="User" value="User"/>
<add key="Domain" value="Domain"/>
<add key="Pwd" value="Pwd"/>
<add key="GlobalSharedPath" value="D:\"/>
</appSettings>

代码:

Public Function WSSUpdateFile(ByVal sFileName As String, ByVal sSiteDoc As String, ByVal sTestCol As String) As String

        Dim sUser As String = ConfigurationManager.AppSettings("User")
        Dim sPwd As String = ConfigurationManager.AppSettings("Pwd")
        Dim sDomain As String = ConfigurationManager.AppSettings("Domain")
        Dim sFileIDinList As String
        Dim strBatch As String = ""
        sSiteDoc = Replace(sSiteDoc, "%20", " ")
        sSiteDoc = Replace(sSiteDoc, "\", "/")
        Dim sFinalFilePath As String
        Dim sSPURL As String = ConfigurationManager.AppSettings("SharePointServer")
        Dim sDocLib As String = ConfigurationManager.AppSettings("DocLibrary")
        Try
            Dim netAccess As System.Net.NetworkCredential = New System.Net.NetworkCredential(sUser, sPwd, sDomain)
            Dim listService As New SPLists.Lists
            listService.Url = sSPURL & "/_vti_bin/lists.asmx"
            listService.Credentials = netAccess
            sFileIDinList = sGetID(listService.Url, sDocLib, sFileName)
            If sFileIDinList <> "" Then
                sFinalFilePath = sSPURL & "/" & sDocLib & "/" & sFileName
                'Now we have FileID so update the list
                strBatch = "<Method ID='1' Cmd='Update'>" + _
                    "<Field Name = 'ID'>" & sFileIDinList & "</Field>" + _
                    "<Field Name = 'FileRef'>" & sFinalFilePath & "</Field>" + _
                    "<Field Name = 'TestCol'>" & sTestCol & "</Field>" + _
                    "</Method>"
                Dim xmlDoc = New System.Xml.XmlDocument
                Dim elBatch As System.Xml.XmlElement = xmlDoc.createelement("Batch")
                elBatch.InnerXml = strBatch
                Dim ndreturn As System.Xml.XmlNode = listService.UpdateListItems(sDocLib, elBatch)
            End If
            Return "TRUE"
        Catch ex As Exception
            Return ex.Message
        End Try
    End Function

Private Function sGetID(ByVal sURL As String, ByVal sListGUID As String, ByVal sFileName As String) As String
        Dim sUser As String = ConfigurationManager.AppSettings("User")
        Dim sPwd As String = ConfigurationManager.AppSettings("Pwd")
        Dim sDomain As String = ConfigurationManager.AppSettings("Domain")
        Dim netAccess As System.Net.NetworkCredential = New System.Net.NetworkCredential(sUser, sPwd, sDomain)
        Dim L As New SPLists.Lists
        L.Credentials = netAccess
        L.Url = sURL
        Dim xmldoc As XmlDocument = New XmlDocument
        Dim query As XmlNode = xmldoc.CreateNode(XmlNodeType.Element, "Query", "")
        query.InnerXml = "<OrderBy><FieldRef Name='Modified'  Ascending='False'></FieldRef></OrderBy>"""
        Try
            Dim caml As XmlNode = L.GetListItems(sListGUID, Nothing, query, Nothing, "1", Nothing)
            Dim id As String = caml.ChildNodes(1).ChildNodes(1).Attributes("ows_ID").Value
            Return id
        Catch ex As Exception
            Return ex.Message
        End Try
    End Function

0

请确保您正在使用字段的内部名称。

要获取字段的内部名称,请打开“新建”表单,然后从上下文菜单中单击“查看源代码”(右键单击“新建”表单页面的任何位置以打开上下文菜单)。您将在源文件末尾看到字段及其内部名称。

查看代码:

string strBatch =

               "<Method ID='1' Cmd='Update'> "
               + " <Field Name='ID'>3</Field> "
               + " <Field Name='Name'>Preeti</Field> "                 
               + " </Method> ";

...

elBatch.SetAttributeNode("UserName", "Preeti");

这两个在SharePoint中实际上是两个不同的属性吗?


0

尝试使用U2UCamlCreator工具,测试您的SharePoint查询。
该工具将帮助您构建批处理以更新SharePoint字段和许多其他功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接