Using New-WebServiceProxy to get, modify, and add items to a list in SharePoint 2007

Using New-WebServiceProxy to get, modify, and add items to a list in SharePoint 2007

  • Comments 11

The motivation

Let’s say that you want to retrieve and modify a list in a SharePoint site, but you don’t have access to Microsoft.SharePoint.dll. One possible solution is to try to search online or ask someone to let you copy the dll. If you are able to get a hold of it, you will quickly realize that the Microsoft.SharePoint.dll has some dependencies and that you are stuck again. Well, I will show you how you can get, modify and add items to a list in SharePoint using PowerShell V2.

Pre requisites: First, you need a SharePoint site and credentials to modify that particular list. The illustration below shows the list (DemoList) that I want to modify.

DemoSite1

Get List Items

The New-WebServiceProxy Cmdlet creates a web service proxy object which lets you use and manage the web service.

# The uri refers to the path of the service description, e.g. the .asmx page            
$uri = "http://powershell/TeamSite/TestTeamSite/Demos/_vti_bin/lists.asmx?WSDL"             
            
# Create the service            
$service = New-WebServiceProxy -Uri $uri  -Namespace SpWs  -UseDefaultCredential            
            
# The name of the list             
$listName = "My Demo List"             
            
# Create xml query to retrieve list.             
$xmlDoc = new-object System.Xml.XmlDocument            
$query = $xmlDoc.CreateElement("Query")            
$viewFields = $xmlDoc.CreateElement("ViewFields")            
$queryOptions = $xmlDoc.CreateElement("QueryOptions")            
$query.set_InnerXml("FieldRef Name='Full Name'")             
$rowLimit = "10"            
            
$list = $null             
$service = $null              
            
try{            
    $service = New-WebServiceProxy -Uri $uri  -Namespace SpWs  -UseDefaultCredential              
}            
catch{             
    Write-Error $_ -ErrorAction:'SilentlyContinue'             
}

Now, we use the service object to retrieve the list.

if($service -ne $null){            
    try{                    
        $list = $service.GetListItems($listName, "", $query, $viewFields, $rowLimit, $queryOptions, "")             
    }            
    catch{             
        Write-Error $_ -ErrorAction:'SilentlyContinue'            
    }            
}

Let’s take a look at the $list object. 

$list

s           : uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882
dt          : uuid:C2F41010-65B3-11d1-A29F-00AA00C14882
rs          : urn:schemas-microsoft-com:rowset
z           : #RowsetSchema
#whitespace : {
              ,
              }
data        : data

 

The items of the DemoList are located in $list.data.row.

$list.data.row

ows_ContentTypeId       : 0x0100F20992473D85F74DBAFD4159A55805FB
ows_Title               : Francisco
ows_Car                 : Impreza
ows_IceCream            : Chocolate
ows_Sport               : Basketball
ows_ID                  : 1
ows_ContentType         : Item
ows_Modified            : 2010-06-24 14:58:17
... (more data) ...

For more information on getting list items visit http://msdn.microsoft.com/en-us/library/lists.lists.getlistitems.aspx

Update List Items

We want to modify the sport field value from “basketball” to “soccer”. to do this, we use the $service and $list from the example above.

# Get name attribute values (guids) for list and view            
$ndlistview = $service.getlistandview($listname, "")            
$strlistid = $ndlistview.childnodes.item(0).name            
$strviewid = $ndlistview.childnodes.item(1).name            
            
                
# Create an xmldocument object and construct a batch element and its attributes.             
$xmldoc = new-object system.xml.xmldocument             
            
# note that an empty viewname parameter causes the method to use the default view               
$batchelement = $xmldoc.createelement("batch")            
$batchelement.setattribute("onerror", "continue")            
$batchelement.setattribute("listversion", "1")            
$batchelement.setattribute("viewname", $strviewid)            
            
            
# Specify methods for the batch post using caml. to update or delete, specify the id of the item,             
# and to update or add, specify the value to place in the specified column            
$id = 1            
$xml = ""            
            
# The row to be modified            
$rowId = $list.data.row.ows_id            
            
# New field value            
$newsport ="soccer"               
            
$xml += <method id='$id' cmd='Update'>" +            
        "<field name='ID'>$rowId</field>" +            
        "<field name='Sport'>$newsport</field>" +            
        "</method>"            
                    
# Set the xml content                    
$batchelement.innerxml = $xml            
            
$ndreturn = $null             
try {            
    $ndreturn = $service.updatelistitems($listname, $batchelement)             
}            
catch {             
    write-error $_ -erroraction:'SilentlyContinue'            
}

For more information on updating list items visit http://msdn.microsoft.com/en-us/library/ms440289.aspx.

Add New Items to the List

To add a new row to the list, everything is the same as in the update list items example above, the only difference is the xml content.

In this case, the new row will contain the following information:
Title: James
Car: A4
Sport: Swimming
Icecream: Strawberry Cheese Cake

$xml = "<method id='$id' cmd='New'>" +            
        "<field name='Title'>James</field>"+            
        "<field name='Car'>A4</field>"+            
        "<field name='Sport'>Swimming</field>" +            
        "<field name='IceCream'>Strawberry cheese Cake</field>" +            
        "</method>""

At the end, our SharePoint list looks like this.

DemoSite2

Cheers,
Francisco Gomez Gamino [MSFT]

Leave a Comment
  • Please add 4 and 8 and type the answer here:
  • Post
  • what's the 2010 version like?  hopefully simpler with their cmdlets?

  • $list.data.row.ows_id returns nothing--there is an ows_id field per item in the $list.data.row array, but that's it. what is $rowId supposed to hold?

  • I can't get this to work.  I have used many iterations and without success.  I keep getting an error,

    Exception calling "UpdateListItems" with "2" argument(s): "Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.

    "

    At line:52 char:37

    + $ndreturn = $service.UpdateListItems <<<< ($listname, $batchelement)              

       + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException

       + FullyQualifiedErrorId : DotNetMethodException

  • I'm getting the same error.  Any idea how to fix this?

    Exception calling "UpdateListItems" with "2" argument(s): "Exception of type 'M

    icrosoft.SharePoint.SoapServer.SoapServerException' was thrown."

  • How can you update a list with text that contains URLs?

  • Regarding the error "Exception calling "UpdateListItems" with "2" argument(s): "Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown."

    Replace this line

     $batchelement = $xmldoc.createelement("batch")  

    by this

     $batchelement = $xmldoc.createelement("Batch")  

    Then it works.

  • Need help

    Update  or add failed

    #Error :  

    Exception calling "UpdateListItems" with "2" argument(s): "Exception of type Microsoft.SharePoint.SoapServer.SoapServerException' was thrown."

    At line:98 char:41

  • For those who felt my pain of the soapserverexception

    Here are my fixes I found by trial and error. For some reason powershell is case sensitive on a few points. (The C# object example doesn't suffer from this.. sigh)

    Not sure what mix of ucasing did the tricking but here are the working bits below:

    [Cmd and ID were the last fixes that gave me relief!]

    $batchelement = $xmldoc.createelement("Batch")            

    $batchelement.setattribute("onerror", "continue")            

    $batchelement.setattribute("listversion", "1")            

    $batchelement.setattribute("viewname", $strviewid)  

    $batchelement.innerxml += "<Method ID='$id' Cmd='New'>" +

    "<Field Name='Sample'>James</Field>"+

    "</Method>"

  • I was getting the error "Exception calling "UpdateListItems" with "2" argument(s): "Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown." when trying to use the Update script.

    I changed the XML to match the format shown in msdn.microsoft.com/.../ms440289.aspx, i.e.

    $xml += "<Method ID='1' Cmd='Update'>" +

      "<Field Name='ID'>18</Field>" +

      "<Field Name='FormStatus'>Complete</Field></Method>"

    Once I used this properly formed XML everything works fine.

  • Thanks for this post. Just found it very useful as I have been trying for ages to get this working. Oddly, I found that the update would not work unless I strictly got the case of the xml right. So, for example, cmd='New' has to be Cmd='New' or I get a generic error from .NET.

    Next thing I'm trying to do is add columns to a list using UpdateList. No luck yet :( . Same generic .NET error though I can't see anything wrong with the case of my xml.

  • I'm trying to use UpdateList to change characteristics of list columns. I get the generic message that:

    "Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.

    Has anyone got this to work via New-WebServiceProxy?

Page 1 of 1 (11 items)