如何使用Sharepoint Web Service从.NET获取文档列表?

Chr*_*ian 12 .net c# sharepoint sharepoint-2007 winforms

技术:Winforms,.NET,C#,Sharepoint Web服务

我目前正在编写一个winform桌面应用程序,该应用程序应该访问特定的Sharepoint文档列表和自定义输入变量(来自Sharepoint文档库)

http://www.infoq.com/articles/swanson-moss-web-services

这个网站让我很好地了解了哪些网络服务可用,但我无法从这里弄清楚如何访问我想要的内容.

使用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");
Run Code Online (Sandbox Code Playgroud)

这是我第一次尝试连接,它给了我一个SOAPException(这是我可以提供的详细信息的范围)

不确定是否需要这样做,但是在"website.com"上托管了一个共享点网站(我试图访问的是"website.com/sites/mysite")这会改变一些事情吗?

我只是想知道我是否在使用这项服务的正确轨道上,或者如果我错了

编辑1:留下原始问题,以便人们了解正在发生的事情.

@CBono:您链接的文章对入门入门起了很大的帮助.(我还不能upvote :()我已经设法获得列表,但格式化,或获取AT数据证明是困难的.这是提供的:

query.InnerXml = "<Where><Gt><FieldRef Name=\"ID\" />" + "<Value Type=\"Counter\">3</Value></Gt></Where>";
viewFields.InnerXml = "<FieldRef Name=\"Title\" />"; 
queryOptions.InnerXml = "";
Run Code Online (Sandbox Code Playgroud)

但我的结果如下:

<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>
Run Code Online (Sandbox Code Playgroud)

我不知道如何使用CAML打破这种局面.(另外,我使用的是Sharepoint Server 2007,而不是2010

CBo*_*ono 25

不确定是否需要这样做,但是在"website.com"上托管了一个共享点网站(我试图访问的是"website.com/sites/mysite")这会改变一些事情吗?

绝对是这样的!您发现的Web服务URL实际上是虚拟的,这意味着URL模式_vti_bin/Lists.asmx在EVERY SharePoint站点下可用.您的列表所在的站点必须是Web服务URL的起点.

因此,尝试: http://website.com/sites/mysite/_vti_bin/Lists.asmx

您可能会发现MSDN的SharePoint Web服务指南文章也很有帮助.


更新#1:

CAML不会帮助您"分解"您的结果.它严格来说是一种查询/过滤技术,看起来你正在使用它.您可以告诉我们您回来的结果是否符合您的预期.如果您需要帮助构建更复杂的CAML查询,我建议下载U2U的CAML查询生成器的副本(但这是另一个主题).

所以,结果.看它有点令人困惑,但有一些疯狂的方法.您在列表中设置的列都在这里(假设您没有将它们限制在CAML查询中,这是可能的).您会注意到它们使用SharePoint的内部名称作为列,前缀为ows_.因此,如果您知道内部名称,则可以构造XML属性名称并使用XML类,LINQ或XSLT来深入了解结果并获得所需内容.有关分割SP内部列名的提示,请参阅我对另一个SO问题的回答.

如果知道在这种情况下我做了什么,我只需构建一个POCO模型类来表示我的一个列表项,并编写一个解析器方法来获取SharePoint的XML结果并返回一组模型对象.我喜欢LINQ to XML来完成这项任务.

如果您使用的是SharePoint 2010,则可以使用新的客户端对象模型类,并在使用SharePoint网站,列表,ListItem等方面获得更好的托管包装.


更新#2:

只是为了某种颜色,我发布了一个用于解析SharePoint XML的代码示例.Registrant在此示例中是我编写的POCO模型类,用于表示自定义列表的SharePoint列表项.这是微不足道的,我不会打扰发布它.

/// <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;
}
Run Code Online (Sandbox Code Playgroud)

更新#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;
}
Run Code Online (Sandbox Code Playgroud)