2009-04-14 6 views
4

Weiß jemand, wie ich alle Elemente von einer SharePoint-Liste bekommen könnte?ColdFusion: Wie benutze ich SharePoint GetListItems()

Es sollte möglich sein, die Funktion getListItems() mit 4 Parametern aufzurufen:

  • Eine für die Liste, in der die Informationen gespeichert sind in,
  • die zweite für die Abfrage,
  • die dritte für die angezeigte Felder und
  • der vierte, der die Anzahl der Zeilen angibt, die zurückgegeben werden sollen.

Mein Code ist:

<cfobject webservice="http://sharepointserver:16999/blog/_vti_bin/SiteData.asmx?wsdl" name="siteDataService" 
    password="pw" 
    username="user" 
    > 

<cfset siteDataService.GetListItems(
    "{9BE74555-1150-4AC8-ADE7-EE52923D7CE8}", 
    "<Where><Lt><FieldRef Name=""ID"" /><Value Type=""Counter"">3</Value></Lt></Where>", 
    "<FieldRef Name=""ID"" /><FieldRef Name=""Title"" />", 
    "4" 
    )>  

<cfset ServiceResponse = GetSOAPResponse(siteDataService)> 
<cfdump var="#ServiceResponse#"> 

Aber alles, was ich bekommen ist, dass Fehlermeldung:

Web-Service-Operation GetListItems mit den Parametern {{9BE74555-1150-4AC8-ADE7-EE52923D7CE8} , 3,, 4} kann nicht gefunden werden.

Normalerweise müssen Sie xmlNodes die Funktion übergeben, wie es gesagt wird here.

Ich habe das auch ausprobiert, weiß aber nicht genau, wie man einen xmlNode erstellt. Mein Code, das auch nicht funktioniert, ist diese:

<cfset xmlDoc = XmlNew()> 
<cfset ndQuery = xmlElemNew(xmlDoc, "Query")> 
<cfset ndViewFields = xmlElemNew(xmlDoc, "ViewFields")> 
<cfset ndQueryOptions = xmlElemNew(xmlDoc, "QueryOptions")> 

<cfset ndQuery = "<Where><BeginsWith><FieldRef Name='Name' /><Value Type='Text'>D</Value></BeginsWith></Where>"> 
<cfset ndViewFields = "<FieldRef Name='ID' />"> 
<cfset ndQueryOptions = ""> 

<cfset listsService.GetListItems(
    "{52D3A638-FA12-44E8-9C17-5FBCD2899199}", 
    "", 
    ndQuery, 
    ndViewFields, 
    "1", 
    ndQueryOptions, 
    "" 
    )> 

<cfset ServiceResponse = GetSOAPResponse(listsService)> 
<cfdump var="#ServiceResponse#"> 

Ist die Art, wie ich den Webservice, den richtigen Weg nenne?

Danke, Kevin


EDIT: Dank für Ihre Antwort danken, ich denke, die XML-Elemente arbeiten.

<cfset listsService.GetListItems(
    "{9BE74555-1150-4AC8-ADE7-EE52923D7CE8}", 
    "{1DD69D36-FD18-42B8-B57D-CCA49FD12AFE}", 
    ndQuery.xmlRoot, 
    ndViewFields.xmlRoot, 
    "1", 
    ndQueryOptions.xmlRoot, 
    "" 
)> 

Aber jetzt erhalte ich eine "Illegal Argument Ausnahme" (das ist toll, weil es mir erzählt, dass der Webservice reagiert;)):

 
Cannot perform web service invocation GetListItems. 

The fault returned when invoking the web service operation is: 

'' java.lang.IllegalArgumentException: [email protected] 

The error occurred in D:\wwwroot\SharePoint-Tests\blog.cfm: line 83 
81 :   "1", 
82 :   ndQueryOptions.xmlRoot, 
83 :  "" 
84 :)> 

EDIT 2:

Das ist mein neuer Code (28. April)

<cfset xmlDoc = XmlNew()> 
<cfset xmlDoc.xmlRoot = xmlElemNew(xmlDoc, "xmlRoot")> 
<cfset xmlDoc.xmlRoot.Query = xmlElemNew(xmlDoc, "Query")> 
<cfset xmlDoc.xmlRoot.ViewFields = xmlElemNew(xmlDoc, "ViewFields")> 
<cfset xmlDoc.xmlRoot.QueryOptions = xmlElemNew(xmlDoc, "QueryOptions")>  


<cfset xmlDoc.xmlRoot.Query.XmlChildren[1] = xmlElemNew(xmlDoc, "Where")> 
<cfset xmlDoc.xmlRoot.Query.where.XmlChildren[1] = xmlElemNew(xmlDoc, "GT")> 
<cfset xmlDoc.xmlRoot.Query.where.gt.XmlChildren[1] = xmlElemNew(xmlDoc, "Value")> 

<cfdump var="#xmlDoc#"> 

<cfset ndQuery = XmlParse("<Query><Where><Gt><FieldRef Name='ID' /><Value Type='Counter'>0</Value></Gt></Where></Query>", true)> 
<cfset ndViewFields = XmlParse("<ViewFields><FieldRef Name='ID' /><FieldRef Name='Title' /></ViewFields>", True)> 
<cfset ndQueryOptions = XmlParse("<queryOptions xmlns:SOAPSDK9=""http://schemas.microsoft.com/sharepoint/soap/""><QueryOptions/></queryOptions>", True)> 

<cfdump var="#ndQuery#"> 
<cfdump var="#ndViewFields#"> 
<cfdump var="#ndQueryOptions#"> 

<cfoutput>#XMLFormat(ndQuery)#</cfoutput><br> 
<cfoutput>#XMLFormat(ndViewFields)#</cfoutput><br> 
<cfoutput>#XMLFormat(ndQueryOptions)#</cfoutput><br> 
<cfinvoke 
    webservice  = "#listsService#" 
    method   = "GetListItems" 
    returnvariable = "result" 
    timeout  = "10" 
> 
    <cfinvokeargument name="listName"  value="{9BE74555-1150-4AC8-ADE7-EE52923D7CE8}"> 
    <cfinvokeargument name="viewName"  value=""> 
    <cfinvokeargument name="query"  value="#ndQuery.XmlRoot#"> 
    <cfinvokeargument name="viewFields" value="#ndViewFields.XmlRoot#"> 
    <cfinvokeargument name="rowLimit"  value="1"> 
    <cfinvokeargument name="queryOptions" value="#ndQueryOptions.XmlRoot#"> 
     <cfinvokeargument name="webID"  value="" omit="yes"> 

    <!--- setting "omit" to "yes" will turn the parameter to null ---> 
</cfinvoke> 

<cfdump var="#result#" label="result"> 

Die Fehlermeldung ist:

Cannot perform web service invocation GetListItems. 
The fault returned when invoking the web service operation is: 
java.lang.IllegalArgumentException: argument type mismatch 
+0

Ich habe die Informationen aus der Antwort, die du auf deine Frage gepostet hast, verschoben - in Zukunft bitte klärende Angaben oder Aktualisierungen in deine Frage einfügen (du kannst immer deine eigenen Sachen bearbeiten). Der Abschnitt "Antworten" ist für tatsächliche Antworten, ich denke, es ist am besten, Sie löschen Ihren Beitrag dort. :) – Tomalak

+0

ok Danke (oder ich einfach einfach "Danke dir"? :)) Hast du eine Idee, was die IllegalArgumentException verursachen könnte? –

+0

Sie können natürlich auf Deutsch wechseln, wenn Sie es wagen. :-D Ich nehme an, dass in den Argumenten immer noch eine Fehlpassung vorliegt, die ColdFusion versucht, implizit auf den Typ zu transformieren, den der WS erwartet, aber fehlschlägt. Siehe die Kommentare zu meiner Antwort. – Tomalak

Antwort

1

Try this:

<!--- parse a bunch of XML documents, case-sensitively ---> 
<cfset ndQuery = XmlParse("<Where><BeginsWith><FieldRef Name='Name' /><Value Type='Text'>D</Value></BeginsWith></Where>", True)> 
<cfset ndViewFields = XmlParse("<FieldRef Name='ID' />", True)> 
<cfset ndQueryOptions = XmlParse("<QueryOptions />", True)> 

<cfset listsService.GetListItems(
     "{52D3A638-FA12-44E8-9C17-5FBCD2899199}", 
     "", 
     ndQuery.XmlRoot, 
     ndViewFields.XmlRoot, 
     "1", 
     ndQueryOptions.XmlRoot, 

)> 

<cfset ServiceResponse = GetSOAPResponse(listsService)> 
<cfdump var="#ServiceResponse#"> 

Vielleicht explizit in dem XML-Root-Knoten zu übergeben, und der Web-Service übernimmt komplette XML-Dokumentobjekte genausogut es nicht notwendig ist.In diesem Fall könnte der folgende Aufruf auch in Ordnung sein:

<cfset listsService.GetListItems(
     "{52D3A638-FA12-44E8-9C17-5FBCD2899199}", 
     "", 
     ndQuery, 
     ndViewFields, 
     "1", 
     ndQueryOptions, 
     "" 
)> 

EDIT: Die MSDN-Seite auf Lists.GetListItems Method heißt es:

queryOptions: Um einen leeren Wert für diese geben Parameter, schließen Sie ein leeres QueryOptions-Element wie folgt ein.

<queryOptions 
xmlns:SOAPSDK9="http://schemas.microsoft.com/sharepoint/soap/"> 
    <QueryOptions/> 
</queryOptions> 

Also, lassen Sie uns dies versuchen:

<cfset ndQueryOptions = XmlParse("<queryOptions xmlns:SOAPSDK9="http://schemas.microsoft.com/sharepoint/soap/"><QueryOptions/></queryOptions>", True)> 

EDIT # 2

Es kann auch ein ganz anderes Problem sein kann - der letzte Parameter des GetListItems() Methode ist optional und sollte auf null festgelegt werden, wenn Sie eine GUID-Zeichenfolge nicht übergeben möchten.

Leider kann die von Ihnen verwendete Aufrufsyntax fehlende Parameter nicht ausdrücken, und CFML hat kein literales Nullzeichen. Sie müssen Ihren Anruf an dem ausführlichen (aber flexibler) <cfinvoke>/<cfinvokeargument> Stil für diese konvertieren:

<cfobject 
    webservice = "http://sharepointserver:16999/blog/_vti_bin/Lists.asmx?wsdl" 
    name  = "listsService" 
    password = "pw" 
    username = "user" 
> 

<cfinvoke 
    webservice  = "#listsService#" 
    method   = "GetListItems" 
    returnvariable = "result" 
    timeout  = "10" 
> 
    <cfinvokeargument name="listName"  value="{52D3A638-FA12-44E8-9C17-5FBCD2899199}"> 
    <cfinvokeargument name="viewName"  value=""> 
    <cfinvokeargument name="query"  value="#ndQuery.XmlRoot#"> 
    <cfinvokeargument name="viewFields" value="#ndViewFields.XmlRoot#"> 
    <cfinvokeargument name="rowLimit"  value="1"> 
    <cfinvokeargument name="queryOptions" value="#ndQueryOptions.XmlRoot#"> 
    <cfinvokeargument name="webID"  value="" omit="yes"> 
    <!--- setting "omit" to "yes" will turn the parameter to null ---> 
</cfinvoke> 

<cfdump var="#result#" label="result"> 

Weitergehende Lesung in dieser Hinsicht auf talkingtree.com ist:
How to invoke a Web Service while omitting optional service method arguments

+0

Dieser Code hat mir sehr geholfen. Aber jetzt habe ich ein anderes Problem. (Illegal argument exception) –

+0

Haben Sie es ohne ".XmlRoot" versucht? Macht es einen Unterschied? – Tomalak

+0

Jetzt bin ich zurück von meinen Ferien. Ich habe Ihren Code von "Edit # 2" ausprobiert, aber es löst auch eine Ausnahme aus. Sie könnten es in meinem "Edit 2:" –

2

können Sie das folgende Beispiel an die Arbeit:

<cfinvoke webservice="http://sharepointserver:16999/blog/_vti_bin/usergroup.asmx?wsdl" method="GetUserCollectionFromWeb" password="[pw]" username="[username]" returnvariable="listOfUsers"/> 

<cfdump var="#listOfUsers#"> 

Ist der SharePoint-Authentifizierungsmechanismus auch für die Standardauthentifizierung verfügbar?