• SHAREPOINT


    首先要了解的是CAML(Collaboration Application Markup Language)不仅仅是用在对列表、文档库的查询,字段的定义,站点定义等处处使用的都是CAML。

    简单的提一下CAML列表查询相关知识,请注意CAML查询无论对于标签还是值均大小写敏感

    CAML查询的根元素是Query,Query元素包含两个元素(非必须):<OrderBy>, <Where>

    <OrderBy>

    <OrderBy>是最简单的元素,用来为返回的数据排序,语法如下:

    <OrderBy>

    <FieldRef Name='LastName' Ascending='False' />

    </OrderBy>

    <OrderBy>语法并非必须且可以在查询中使用多个OrderBy。

    <Where>

    <Where>元素用来指定查询条件,此元素语法非常简单,但根据具体的情况也会写得非常的复杂。

    <Where>

    <Eq>

    <FieldRef Name='LastName' />

    <Value Type='Text'>Johnson</Value>

    </Eq>

    </Where>

    操作符有:Eq等于;Neq不等于;Gt大于;Geq大于等于;Lt小于;Leq小于等于;IsNull是否空;BeginsWith开始于;Contains包含

    字段FieldRef元素可以是列表中的任何一个字段,如果使用Name属性则必须指定内部名称,也可以使用ID属性指定字段的GUID;

    值Value元素指定具体的查询条件,如果没有指定默认是Text,DateTime的使用复杂些稍候详细说明。

    如果查询的字段类别是lookup,指定值的时候可以指定具体值也可以指定ID,如果需要指定ID,需要在FieldRef元素里指定LookupId为true,例:

    <where>

    <Eq>

    <FieldRef Name='Country' />

    <Value Type='Lookup'>China</Value>

    </Eq>

    </Where>

    或者

    <where>

    <Eq>

    <FieldRef Name='Country' LookupId='True' />

    <Value Type='Lookup'>15</Value>

    </Eq>

    </Where>

    如果想指定两个查询条件,需要指定And或者Or

    <Where>

    <And>

    <Eq>

    <FieldRef Name='LastName' />

    <Value Type='Text'>Wang</Value>

    </Eq>

    <Geq>

    <FieldRef Name='Age' />

    <Value Type='Number'>21</Value>

    </Geq>

    </And>

    </Where>

    如果有两个以上的查询条件需要按比较特殊的方式来指定:

    <Where>

    <And>

    <And>

    <Eq>

    <FieldRef Name='LastName' />

    <Value Type='Text'>Wang</Value>

    </Eq>

    <Geq>

    <FieldRef Name='Age' />

    <Value Type='Number'>21</Value>

    </Geq>

    </And>

    <Lt>

    <FieldFef Name='Age' />

    <Value Type='Number>60</Value>

    </Lt>

    </And>

    </Where>

    查询条件再多按此类推。

    通过SharePoint Web Service获取列表数据:

    在Visual Studio 2005里添加Web Service,在Visual Studio 2008里面添加Service Reference或者也可以直接使用Web Service,使用Service Reference实际是使用WCF方式,调用和配置稍有不同,这里不做赘述。以Web Service为例:

    添加Web Service,取名为ListService

    ListService.Lists listws = new ListService.Lists();

    listws.url = siteURL + @"/_vti_bin/lists.asmx";

    如果使用默认Credential即可:listws.Credentials = System.Net.CredentialCache.DefaultCredential;

    如果指定用户密码:listws.Credentials = System.Net.NetworkCredential(userName, password, domain);

    这样就准备好可以调用接口获取数据了:

    XmlNode resultNode = listws.GetListItems(listName, viewName, queryNode, viewFieldsNode, rowLimit, queryOptionsNode, webID);

    获得返回的resultNode数据后经常需要按照attributes或者sub node来进行数据的解析,但返回的resultNode不能直接使用,通常需要经过以下处理:

    XmlNamespaceManager ns = new XmlNamespaceManager(resultNode.OwnerDocument.NameTable);

    ns.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
    ns.AddNamespace("z", "#RowsetSchema"); 
    XmlNodeList nodes = resultNode.SelectNodes(@"//z:row", ns);

    之后就可以loop nodes的各个值并通过attributes, value等属性来获得属性信息或者值信息。

    参数说明:

    listName: string类型,使用显示名或者GUID,推荐使用GUID,在使用GUID时注意要使用{}包含GUID;

    viewName: string类型,使用带{}的GUID,注意不能使用显示名否则会报运行时错误,如果使用空或者null,则会选用默认视图,如果提供了GUID,query, viewFields或者rowLimit的值会覆盖掉view里面的相应设置,比如在视图里设置了行数限制为100,但是接口参数rowLimit指定为1000,则最终返回1000行而不是100行。

    queryNode: System.Xml.XmlNode类型,按照前文提到的方式指定查询条件;

    viewFields: System.Xml.XmlNode类型,指定哪些字段将被返回,例:

    <ViewFields>

    <FieldRef Name='ID' />

    <FieldRef Name='Title' />

    </ViewFields>

    rowLimit: string类型,指定返回的行数;

    queryOptions: System.Xml.XmlNode类型,通过不同的节实现了SPQuery里的各个属性,例如:

    <QueryOptions>

    <IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>

    <DateInputc>TRUE</DateInputc>

    </QueryOptions>

    QueryOptions里有以下属性可以设置:

    DateInUtc: TRUE返回值为UTC格式,否则为ISO格式;

    Folder: 可以指定查询列表中某一指定文件夹内的数据;

    Paging: SharePoint支持服务器端分页,通过ListItemCollectionPositionNext属性来控制分页,具体说明稍候会做介绍;

    IncludeMandatoryColumns: TURE返回在viewFields参数指定的字段以外的强制系统字段(例如:owsHiddenVersion, 必须字段等),默认值为TURE;

    MeetingInstanceID和ViewAttributes平时使用很少,有兴趣可以参考http://msdn.microsoft.com/en-us/library/lists.lists.getlistitems(v=office.12).aspx

    最后一个参数是webID: string类型,使用带{}的GUID,如果指定为null,默认使用web service的url参数里的值,如果没有指定url值,则使用根web。

    返回的结果是System.Xml.XmlNode对象,例如:

    <rs:data ItemCount="2" xmlns:rs="urn:schemas-microsoft-com:rowset">
       <z:row ows_testCAML="1" ows_MetaInfo="1;#" ows__ModerationStatus="0" ows__Level="1" ows_Title="test1" ows_ID="1" ows_owshiddenversion="2" ows_UniqueId="1;#{C6DF94AE-1086-451F-BE4C-88D170AC27D6}" ows_FSObjType="1;#0" ows_Created="2011-02-15 12:04:24" ows_FileRef="1;#Lists/TestCustomizationFields/1_.000" xmlns:z="#RowsetSchema" />
       <z:row ows_testCAML="2" ows_MetaInfo="2;#" ows__ModerationStatus="0" ows__Level="1" ows_Title="test1" ows_ID="2" ows_owshiddenversion="1" ows_UniqueId="2;#{ED63E2F8-5807-4B97-9B84-9932B76464F8}" ows_FSObjType="2;#0" ows_Created="2011-02-27 13:43:47" ows_FileRef="2;#Lists/TestCustomizationFields/2_.000" xmlns:z="#RowsetSchema" />
    </rs:data>

      

    分页处理:

    关于ListItemCollectionPositionNext,如果数据实际条数超过了返回条数,在rs:data里会包含分页相关信息:
    <rs:data ItemCount="5" ListItemCollectionPositionNext="Paged=TRUE&amp;p_ID=5" xmlns:rs="urn:schemas-microsoft-com:rowset">
    在查询的时候通过指定QueryOptions选项相应设置可以查询指定页的内容,接上面的例子,通过:<Paging ListItemCollectionPositionNext='Paged=TRUE&amp;p_ID=5' />就可以查询从第6条数据开始的内容了;

    查询文件夹:

    如果需要查询指定的文件夹,使用以下方式:

    XmlDocument camlDocument=new XmlDocument();

    XmlNode queryOptionsNode = camlDocument.CreateElement("QueryOptions");

    queryOptionsNode.InnerXml="<Folder>doclibs/folder1</Folder>";

    时间的相关处理:

    如果要拿Date Time类型的字段做为过滤条件的时候,需要特别予以注意,要采用SharePoint的方式来进行处理:

    <Where>

    <Ge>

    <FieldRef Name='StartDate'>

    <Value Type='DateTime'>2008-12-08T10:00:00z</value>

    </Ge>

    </Where>

    在以上的表述中时间部分将会被忽略掉,开始日期在12月8号以及以后十点以前以后的数据都会被返回,如果希望查询中也能通过时间来进行查询,需要使用一个特殊的属性IncludeTimeValue.

    <Where>

    <Ge>

    <FieldRef Name='StartDate' IncludeTimeValue='TRUE'>

    <Value Type='DateTime'>2008-12-08T10:00:00z</value>

    </Ge>

    </Where>

    如果要使用当天做为查询条件:

    <Where>

    <Ge>

    <FieldRef Name='StartDate'>

    <Value Type='DateTime'><Today /></value>

    </Ge>

    </Where>

    Today只考虑日期没有时间的处理,但是SharePoint并不支持Now这样的用法。另外,Today支持Offset,增加或者减少指定的天数:

    <Value Type='DateTime'><Today Offset='10'/></value>

    日历列表数据的处理:

    日历列表继承自事件内容类型,一般的事件均可以通过CAML来获取,但是处理重复发生的事件(如:每日一次)的时候需要经过特殊处理。

    事件内容类型定义了一个叫做fRecurrence的字段,当重复发生性事件创建后,它的值被设置为1。Calendar视图处理输出重复发生的事件的时候,重复事件被分成若干个事件实例。对重复的定义存在另外一个事件内容类型的Xml字段里RecurrenceData,例如:

    <recurrence>

    <rule>

    <firstDayOfWeek>su</firstDayOfWeek>

    <repeat>

    <weekly mo='TRUE' we='TURE' weekFrequency='1' />

    </repeat>

    </rule>

    </recurrence>

    幸运的是我们不需要自己来解析这段Xml,我们可以通过组拼CAML条件和QueryOptions来达到查询的目的,详细的可以查看http://sharepointmagazine.net/articles/writing-caml-queries-for-retrieving-list-items-from-a-sharepoint-list最后一个Section,更详细的可以查看http://sharepoint.microsoft.com/blog/Pages/BlogPost.aspx?PageType=4&ListId={72C1C85B-1D2D-4A4A-90DE-CA74A7808184}&pID=761。

    参考:

    CAML获取列表数据:http://sharepointmagazine.net/articles/writing-caml-queries-for-retrieving-list-items-from-a-sharepoint-list

    使用WebService取得列表数据:http://msdn.microsoft.com/en-us/library/ms429658(v=office.12).aspx

      http://msdn.microsoft.com/en-us/library/lists.lists.getlistitems(v=office.12).aspx

    详细了解日历查询:http://sharepoint.microsoft.com/blog/Pages/BlogPost.aspx?PageType=4&ListId={72C1C85B-1D2D-4A4A-90DE-CA74A7808184}&pID=761

  • 相关阅读:
    easyExcel入门
    UML-从需求到设计--迭代进化
    UML-操作契约总结
    102. Binary Tree Level Order Traversal
    98. Validate Binary Search Tree
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    84. Largest Rectangle in Histogram
    92. Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/914556495wxkj/p/3660511.html
Copyright © 2020-2023  润新知