テクノロジ:Winforms、.NET、C#、Sharepoint Webサービス
私は現在、Sharepointドキュメントとカスタム入力変数の特定のリストにアクセスすることになっているwinformデスクトップアプリケーションを作成しています(Sharepointドキュメントライブラリから)
http://www.infoq.com/articles/swanson-moss-web-services
このWebサイトは、どのWebサービスが利用可能であるかをよく理解してくれましたが、ここから自分が欲しいものにアクセスする方法を理解できません。
ウェブ参照として、website.com/_vti_bin/Lists.asmxとwebsite.com/_vti_bin/Dws.asmxを使用します。
com.website.Lists splist = new Project.com.website.Lists();
com.website1.Dws spData = new Project.com.website1.Dws();
splist.Credentials = new NetworkCredential("username", "password", "domain");
splist.GetList("My_list");
これは私の接続の最初の試みでした、そしてそれは私にSOAPExceptionを与えます(それは私が与えることができる詳細の範囲です)
これが必要かどうかはわかりませんが、「website.com」でホストされているシェアポイントサイトが複数あります(私がアクセスしようとしているサイトは「website.com/sites/mysite」です)。
私はこのサービスを使用する上で正しい軌道に乗っているかどうか、またはすべてが間違っているかどうかを調べようとしています
編集1:人々が何が起こっているのか理解できるように、元の質問を残します。
@CBono:リンクした記事は、始めるにあたっての大きな助けになりました。 (まだ賛成できません:()リストを取得できましたが、フォーマット、またはAT=データを取得できません。提供されたものは次のとおりです。
query.InnerXml = "<Where><Gt><FieldRef Name=\"ID\" />" + "<Value Type=\"Counter\">3</Value></Gt></Where>";
viewFields.InnerXml = "<FieldRef Name=\"Title\" />";
queryOptions.InnerXml = "";
しかし、私の結果は次のようになります:
<rs:data ItemCount="4" xmlns:rs="urn:schemas-Microsoft-com:rowset">
<z:row ows_Title="" ows_Deal_x0020_ID="4055.00000000000" ows_MetaInfo="8;#Subject:SW| Deal ID:DW|4055.00000000000 vti_parserversion:SR|12.0.0.6545 _Category:SW| SVP Approved?:IW|1 vti_author:SR|DD\\admin vti_approvallevel:SR| vti_categories:VW| vti_modifiedby:SR|DD\\admin vti_assignedto:SR| Keywords:SW| vti_cachedcustomprops:VX|vti_approvallevel vti_categories Subject Deal\\ ID vti_assignedto Keywords vti_title _Author _Category Quarter-End\\ Date ContentType SVP\\ Approved? _Comments ContentTypeId:SW|0x0101004E1C496569BCDF42912D848E8085351A ContentType:SW|Document vti_cachedtitle:SR| vti_title:SR| _Author:SW| Quarter-End Date:SW|2008-10-31T00:00:00Z _Comments:SW| " ows__ModerationStatus="0" ows__Level="1" ows_Last_x0020_Modified="8;#2011-07-04 16:21:56" ows_Quarter_x002d_End_x0020_Date="2008-10-31 00:00:00" ows_ID="8" ows_owshiddenversion="3" ows_UniqueId="8;#{6594AD67-6954-4641-BDA5-8FECEDCCEAD8}" ows_FSObjType="8;#0" ows_Created_x0020_Date="8;#2011-07-04 16:20:00" ows_ProgId="8;#" ows_FileLeafRef="8;#Deal Name Q1.doc" ows_Modified="2011-07-04 16:21:55" ows_FileRef="8;#sites/site1/deals/Deal Name Q1.doc" ows_DocIcon="doc" ows_Editor="605;#Doe, John" xmlns:z="#RowsetSchema" />
<z:row ows_Title="" ows_Deal_x0020_ID="4576.00000000000" ows_MetaInfo="9;#Subject:SW| Deal ID:DW|4576.00000000000 vti_parserversion:SR|12.0.0.6545 _Category:SW| SVP Approved?:IW|1 vti_author:SR|DD\\admin vti_approvallevel:SR| vti_categories:VW| vti_modifiedby:SR|DD\\admin vti_assignedto:SR| Keywords:SW| vti_cachedcustomprops:VX|vti_approvallevel vti_categories Subject Deal\\ ID vti_assignedto Keywords vti_title _Author _Category Quarter-End\\ Date ContentType SVP\\ Approved? _Comments ContentTypeId:SW|0x0101004E1C496569BCDF42912D848E8085351A ContentType:SW|Document vti_cachedtitle:SR| vti_title:SR| _Author:SW| Quarter-End Date:SW|2011-01-31T00:00:00Z _Comments:SW| " ows__ModerationStatus="0" ows__Level="1" ows_Last_x0020_Modified="9;#2011-07-04 16:22:37" ows_Quarter_x002d_End_x0020_Date="2011-01-31 00:00:00" ows_ID="9" ows_owshiddenversion="3" ows_UniqueId="9;#{0AD9B000-3736-4B7B-9182-57C270824B8A}" ows_FSObjType="9;#0" ows_Created_x0020_Date="9;#2011-07-04 16:22:08" ows_ProgId="9;#" ows_FileLeafRef="9;#Deal Name Q4.doc" ows_Modified="2011-07-04 16:22:37" ows_FileRef="9;#sites/site1/deals/Deal Name Q4.doc" ows_DocIcon="doc" ows_Editor="605;#Doe, John" xmlns:z="#RowsetSchema" />
<z:row ows_Title="" ows_Deal_x0020_ID="80003.0000000000" ows_MetaInfo="10;#Subject:SW| Deal ID:DW|80003.0000000000 vti_parserversion:SR|12.0.0.6545 _Category:SW| SVP Approved?:IW|0 vti_author:SR|DD\\admin vti_approvallevel:SR| vti_categories:VW| vti_modifiedby:SR|DD\\admin vti_assignedto:SR| Keywords:SW| vti_cachedcustomprops:VX|vti_approvallevel vti_categories Subject Deal\\ ID vti_assignedto Keywords vti_title _Author _Category Quarter-End\\ Date ContentType SVP\\ Approved? _Comments ContentTypeId:SW|0x0101004E1C496569BCDF42912D848E8085351A ContentType:SW|Document vti_cachedtitle:SR| vti_title:SR| _Author:SW| Quarter-End Date:SW|2011-01-31T00:00:00Z _Comments:SW| " ows__ModerationStatus="0" ows__Level="1" ows_Last_x0020_Modified="10;#2011-07-04 16:23:15" ows_Quarter_x002d_End_x0020_Date="2011-01-31 00:00:00" ows_ID="10" ows_owshiddenversion="3" ows_UniqueId="10;#{07543C39-F299-4085-82CE-F059257796EA}" ows_FSObjType="10;#0" ows_Created_x0020_Date="10;#2011-07-04 16:22:56" ows_ProgId="10;#" ows_FileLeafRef="10;#Deal Name Q3.doc" ows_Modified="2011-07-04 16:23:15" ows_FileRef="10;#sites/site1/deals/Deal Name Q3.doc" ows_DocIcon="doc" ows_Editor="605;#Doe, John" xmlns:z="#RowsetSchema" />
<z:row ows_Title="" ows_Deal_x0020_ID="3319.00000000000" ows_MetaInfo="11;#Subject:SW| Deal ID:DW|3319.00000000000 vti_parserversion:SR|12.0.0.6545 _Category:SW| SVP Approved?:IW|1 vti_author:SR|DD\\admin vti_approvallevel:SR| vti_categories:VW| vti_modifiedby:SR|DD\\admin vti_assignedto:SR| Keywords:SW| vti_cachedcustomprops:VX|vti_approvallevel vti_categories Subject Deal\\ ID vti_assignedto Keywords vti_title _Author _Category Quarter-End\\ Date ContentType SVP\\ Approved? _Comments ContentTypeId:SW|0x0101004E1C496569BCDF42912D848E8085351A ContentType:SW|Document vti_cachedtitle:SR| vti_title:SR| _Author:SW| Quarter-End Date:SW|2009-10-31T00:00:00Z _Comments:SW| " ows__ModerationStatus="0" ows__Level="1" ows_Last_x0020_Modified="11;#2011-07-04 16:23:55" ows_Quarter_x002d_End_x0020_Date="2009-10-31 00:00:00" ows_ID="11" ows_owshiddenversion="3" ows_UniqueId="11;#{E51AB6A9-DDE1-4F66-8E44-EDFA3D0AFF7F}" ows_FSObjType="11;#0" ows_Created_x0020_Date="11;#2011-07-04 16:23:27" ows_ProgId="11;#" ows_FileLeafRef="11;#Deal Name Q2.doc" ows_Modified="2011-07-04 16:23:55" ows_FileRef="11;#sites/site1/deals/Deal Name Q2.doc" ows_DocIcon="doc" ows_Editor="605;#Doe, John" xmlns:z="#RowsetSchema" />
</rs:data>
そして、私はCAMLを使用してそれを分解する方法を考えていません。 (また、2010ではなく、Sharepoint Server 2007を使用しています
これが必要かどうかはわかりませんが、「website.com」でホストされているシェアポイントサイトが複数あります(私がアクセスしようとしているサイトは「website.com/sites/mysite」です)。
もちろんです!発見したWebサービスのURLは実際には仮想です。つまり、URLパターン_vti_bin/Lists.asmx
はすべてのSharePointサイトで利用できます。リストが存在するサイトがWebサービスURLの開始点である必要があります。
したがって、以下を試してください:http://website.com/sites/mysite/_vti_bin/Lists.asmx
MSDNの SharePoint Webサービスガイドライン の記事も参考になります。
更新#1:
CAMLは、結果を「分解」するのに役立ちません。これは厳密にクエリ/フィルター技術であり、適切に使用しているように見えます。返されている結果セットが期待どおりかどうかは、お客様の責任です。より複雑なCAMLクエリの作成についてサポートが必要な場合は、 2UのCAMLクエリビルダー のコピーをダウンロードすることをお勧めします(ただし、これは別のトピックです)。
それでは、結果について説明します。それを見るのは少し混乱しますが、狂気にはいくつかの方法があります。リストに設定した列はすべてここにあります(可能であれば、CAMLクエリで列を制約しない場合)。列のSharePointのinternal名を使用し、先頭にows_
を付けたことがわかります。したがって、内部名がわかっている場合は、XML属性名を作成し、XMLクラス、LINQ、またはXSLTを使用して、結果に飛び込んで必要なものを取得できます。 別の回答への私の回答SO質問 を参照してください。
この状況で私が何をしているのかを知るのに役立つ場合は、 [〜#〜] poco [〜#〜] モデルクラスを作成して、リスト項目の1つを表し、パーサーメソッドをSharePointのXML結果を取得し、モデルオブジェクトのコレクションを返します。このタスクにはLINQ to XMLが好きです。
SharePoint 2010を使用していた場合、新しい クライアントオブジェクトモデルクラス を使用して、SharePointサイト、リスト、リストアイテムなどの操作に関する優れた管理ラッパーを取得できます。
UPDATE#2:
少し色を付けるために、SharePoint XMLの解析に使用するコードのサンプルを投稿しています。この例のRegistrant
は、カスタムリストのSharePointリストアイテムを表すために私が作成したPOCOモデルクラスです。それは些細なことであり、私はそれを投稿する気にはならないでしょう。
/// <summary>
/// Parses registrant XML returned from SharePoint's Lists web service into a collection
/// of <see cref="Registrant"/> objects (root element = "listitems").
/// </summary>
/// <param name="xml">SharePoint XML</param>
/// <returns>Collection of Registrant objects, or null if no registrant data could be parsed.</returns>
public static List<Registrant> ParseSharePointXmlCollection( XElement xml ) {
// Test: Not expected XML element or has no child elements
if ( !xml.Name.LocalName.Equals( "listitems" ) || !xml.HasElements ) {
return null;
}
List<Registrant> regList = null;
XElement data = xml.Element( XName.Get( "data", "urn:schemas-Microsoft-com:rowset" ) );
if ( (data != null) && (data.HasElements) ) {
regList = new List<Registrant>();
IEnumerable<XElement> regXmlNodes = data.Elements( XName.Get( "row", "#RowsetSchema" ) );
foreach (XElement regXml in regXmlNodes) {
Registrant reg = ParseSharePointXml( regXml );
if ( reg != null ) {
regList.Add( reg );
}
}
}
return regList;
}
/// <summary>
/// Parses registrant XML returned from SharePoint's Lists web service into a single
/// <see cref="Registrant"/> object (root element = "row").
/// </summary>
/// <param name="xml">SharePoint XML</param>
/// <returns>A Registrant object, or null if no registrant data could be parsed.</returns>
public static Registrant ParseSharePointXml( XElement xml ) {
// Test: Not expected XML element or has no attributes
if ( !xml.Name.LocalName.Equals( "row" ) || !xml.HasAttributes ) {
return null;
}
Registrant reg = null;
// Parse ID (if this fails, fail the whole operation)
if ( xml.Attribute( "ows_ID" ) != null ) {
reg = new Registrant();
reg.ID = xml.Attribute( "ows_ID" ).Value;
}
else {
return null;
}
// Parse First Name
if ( xml.Attribute( "ows_Q_Registrant_x0020_First_x0020_N" ) != null ) {
reg.FirstName = xml.Attribute( "ows_Q_Registrant_x0020_First_x0020_N" ).Value;
}
// Parse Last Name
if ( xml.Attribute( "ows_Q_Registrant_x0020_Last_x0020_Na" ) != null ) {
reg.LastName = xml.Attribute( "ows_Q_Registrant_x0020_Last_x0020_Na" ).Value;
}
// Parse Email
if ( xml.Attribute( "ows_Q_Registrant_x0020_Email" ) != null ) {
reg.Email = xml.Attribute( "ows_Q_Registrant_x0020_Email" ).Value;
}
// Parse Assistant Name
if ( xml.Attribute( "ows_Q_Asst_x0020_First_x0020_Name" ) != null ) {
reg.AssistantFirstName = xml.Attribute( "ows_Q_Asst_x0020_First_x0020_Name" ).Value;
}
if ( xml.Attribute( "ows_Q_Asst_x0020_Name" ) != null ) {
reg.AssistantLastName = xml.Attribute( "ows_Q_Asst_x0020_Name" ).Value;
}
// Parse Assistant Email
if ( xml.Attribute( "ows_Q_Asst_x0020_Email" ) != null ) {
reg.AssistantEmail = xml.Attribute( "ows_Q_Asst_x0020_Email" ).Value;
}
return reg;
}
UPDATE#3:
XmlNode
オブジェクトをXElement
に変換するサンプルコード:
public static XElement GetXElement( this XmlNode node ) {
XDocument xdoc = new XDocument();
using ( XmlWriter xmlWriter = xdoc.CreateWriter() ) {
node.WriteTo( xmlWriter );
}
return xdoc.Root;
}
私の仕事では、Harmon.ieの SharePointアドオン と同じようなことをする必要がありました。 SharePointとOutlookを統合する機能のスイート全体を備えています。 Outlookでドキュメントをサイドバーとしてリストするだけでよいので、自分で開発しようとしました。
私はオープンソースコードフォーラム このプロジェクト を採用しようとしましたが、私の深さをはるかに超えてしまいました。参考にしていただければ助かります。