SharePoint CAML查询

协作应用程序标记语言 (CAML) 是一种基于 XML 的语言,用于在 Windows SharePoint Services 中定义在网站和列表中使用的字段和视图。CAML 还用于在网站设置过程中定义 Windows SharePoint Services 数据库中的表。也可以对列表进行更新,在使用SharePoint Web Service的时候十分重要。详细的规范请参考http://msdn.microsoft.com/zh-cn/library/ms462365.aspx,本文列出一些常用的和重要的信息。

1. 一些属性 

RowLimit:<RowLimit>10</RowLimit>查询结果的返回行限制 

ViewFields:<ViewFields> <FieldRef Name='Title'/> <FieldRef Name='Name'/></ViewFields>查询结果要显示的字段 

 

2. 查询条件 

query.Query = "<Where><Eq><FieldRef Name='Status'/>" + "<Value Type='Text'>Completed</Value></Eq></Where>";

2.1.比较操作符如下:

操作符有: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>

Comparison Operators

General Meaning

Eq

=

Gt

>

Lt

<

Geq

>=

Leq

<=

Neq

<>

Contains

Like

IsNull

Null

IsNotNull

NotNull

BeginsWith

Beginning with word

DateRangesOverlap

compare the dates in a recurring event with a specified DateTime value, to determine whether they overlap

2.2.Or

.<Where> <Or> <Geq><FieldRef Name='Field1'/> <Value Type='Number'>1500</Value> </Geq> <Leq> <FieldRef Name='Field2'/><Value Type='Number'>500</Value> </Leq> </Or> </Where>

2.3.And

<Where> <And> <BeginsWith> <FieldRef Name="Conference"/> <Value Type="Note">Morning</Value> </BeginsWith> <Contains> <FieldRef Name="Conference" /> <Value Type="Note">discussion session</Value> </Contains> </And></Where>

2.4.Orderby

<OrderBy>

<FieldRef Name="Modified" Ascending="FALSE"></FieldRef>

</OrderBy>

2.5.GroupBy

<GroupBy>

<FieldRef Name="Modified"/>

</GroupBy>

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

<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>

3.转义

Original

Replacement

"

\"

\

\\

+

\u002b

>

\u003e

<

\u003c

'

\u0027

 

 

 

 

例:

<FieldRef Name=\"Checkbox\"></FieldRef> <Value Type=\"bit\">1</Value>

4.Batch

内嵌于 HTTP 协议中,Batch 元素必须至少包含一个 Method 元素。Batch 元素允许客户端应用程序一次性向服务器传送多个命令。

4.1.格式

 

<Batch

OnError = "Return" | "Continue"

ListVersion = ""

Version = ""

ViewName = "">

<Method>

...

</Method>

...

</Batch>

属性

说明

ListVersion

可选属性,类型为 Integer。指定列表的版本号。

OnError

可选。以下是可能的值:

· Return — 在遇到第一个错误之后,停止执行任何方法。此值为默认值。

· Continue — 在遇到错误后,继续执行后续方法。

Version

可选属性,类型为 String。指定正在服务器上运行的 Windows SharePoint Services 的版本号。版本号包含四个整数,格式为 N.N.N.NNNN,它们表示产品的主版本、次版本、阶段版本和增量版本。

ViewName

可选属性,类型为 Guid。指定视图的 GUID。

 

4.2.Method:在批处理中用于指定 Batch 元素中的命令。 

Method 元素是 Batch 元素所必需的

<Method ID="Text"

Cmd = "Text"

ID = "Text">

</Method>

属性

说明

Cmd

可选属性,类型为 Text。在 Web 服务中使用,指定相关命令发布到服务器以进行列表项更新。可能的值包括:

· Delete — 删除指定项目。

· New — 创建指定项目。

· Update — 修改指定项目。

ID

必需属性,类型为 Text。自由形式标识字符串,它实际并非由服务器使用,而是返回到客户端。

4.3. SetList:指定当前正在使用的列表。

<SetList

Name = "Text"

PreserveContext = "TRUE" | "FALSE"

Scope = "Request">

</SetList>

属性

说明

Name

必需属性,类型为 Text。指定该列表的名称。

PreserveContext

可选属性,类型为 Boolean。如果为 FALSE,则实现 SetList 元素将返回数据库查询,该查询是获取显示单个列表项的表单中数据所必需的。当视图和表单位于同一页面中时,此功能非常有用。默认值为 TRUE。

Scope

当设置为 Request 时,此属性使整个列表可用于该页面。

4.4. SetVar:允许在本地将页呈现到当前 XML 级别或将页全局呈现到页的上下文中设置变量。

<SetVar

ID = "Text"

Name = "Text"

Scope = "Request"

Value = "Text">

</SetVar>

属性

说明

ID

可选属性,类型为 Text。提供变量的 ID。

Name

必需属性,类型为 Text。指定变量的名称。

Scope

如果设置为 Request,则变量是全局变量。

Value

可选属性,类型为 Text。当这是一个空元素时,可用于为变量指定值。

在下面的示例中,第一个 GetVar 元素返回“Value_2”,第二个 GetVar 元素返回“Value_1”,因为包含“Value_2”的 SetVar 元素仅适用于“Sample”元素的子级。“Value_2”在“Sample”结束标记之后超出范围。

XML

<SetVar Name="myVar">Value_1</SetVar>

<Sample>

<SetVar Name="myVar">Value_2</SetVar>

<GetVar Name="myVar"/>

</Sample>

<GetVar Name="myVar"/>

4.5.例子

batchElement.InnerXml = "<Method ID='1' Cmd='Update'>" +

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

"<Field Name='Title'>Modified sixth item</Field></Method>" +

"<Method ID='2' Cmd='Update'><Field Name='ID'>7</Field>" +

"<Field Name='Title'>Modified seventh item</Field></Method>" +

"<Method ID='3' Cmd='Delete'><Field Name='ID'>5</Field>" +

"</Method><Method ID='4' Cmd='New'>" +

"<Field Name='Title'>Added item</Field></Method>";

5.WSS中的各种字段类型与.NET中对应的数据类型的对照关系

Name

Format

Attachments

System.Boolean

Boolean

System.Boolean

Calculated

N/A

Choice

System.String

Computed

N/A

Counter

System.Int32

CrossProjectLink

System.Boolean

Currency

System.Double

DateTime

System.DateTime

GridChoice

System.String

Guid

System.Guid

Integer

System.Int32

Lookup

System.String

MaxItems

System.Int32

ModStat

System.Int32

MultiChoice

System.String

Note

System.String

Number

System.Double

Recurrence

System.Boolean

Text

System.String

Threading

System.String

URL

System.String, System.String

User

System.String

 

 

4.6 使用CAML注意事项:

如果查询的字段类别是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>

分页处理:

关于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>";

时间的相关处理:时间格式 DateTime.Now.Date.ToString(@"yyyy-MM-dd\THH:mm:ss\Z")

关键字:Today 今天的日期
TodayIso 今天的日期(ISO格式)

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

<Where>

<Ge>

<FieldRef Name='StartDate'>

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

</Ge>

</Where>

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

<Where>

<Geq>

<FieldRef Name='StartDate' >

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

</Geq>

</Where>

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

<Where>

<Gt>

<FieldRef Name='StartDate'>

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

</Gt>

</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

 

用户

<Eq><FieldRef Name='UserName'/><Value Type='User'>张三</Value></Eq>

  <Eq>
  <FieldRef Name="Author" LookupId="TRUE">   </FieldRef>
  <Value Type="User">8</Value>  </Eq>

boolean:

<Eq><FieldRef Name='IsDisplay' /><Value Type='Boolean'>1</Value></Eq>

 

 

ViewAttributes

ViewAttributes = "Scope='FilesOnly'"
 Scope='Default' : 只顯示指定文件夾下的項目及子文件夾
  Scope='FilesOnly' : 只顯示指定文件夾下的項目
 Scope='Recursive' : 顯示所有項目,不顯示文件夾
 Scope='RecursiveAll' : 顯示所有項目和所有子文件夾

 #region 1.文档库下所有文档及文件夹
            //递归查询,加了下面的参数的话会将文档库的所有文档及文件夹查询出来
            //否则只查询根目录下的文档及文件夹
            //query.ViewAttributes = "Scope='RecursiveAll'";
            #endregion

            #region 2.文档库下所有的文档
            //查询文档库下的文档
            //query.ViewAttributes = "Scope='Recursive'";

            ////或者

            //query.ViewAttributes = "Scope='RecursiveAll'";
            //query.Query =
            //    @"<Where>
            //        <Eq>
            //            <FieldRef Name='FSObjType' />
            //            <Value Type='Integer'>0</Value>
            //        </Eq>
            //    </Where>";  
            #endregion

            #region 3.文档库下的所有文件夹
            //查询文档库下的所有文件夹
            //query.ViewAttributes = "Scope='RecursiveAll'";
            //query.Query = 
            //    @"<Where>
            //        <Eq>
            //            <FieldRef Name='FSObjType' />
            //            <Value Type='Integer'>1</Value>
            //        </Eq>
            //    </Where>";            
            #endregion

            #region 4.模糊查询指定名称的项目
            //模糊查询指定名称的项目
            //query.ViewAttributes = "Scope='RecursiveAll'";
            //query.Query =@"
            //<Where>
            //    <Contains>
            //        <FieldRef Name='FileLeafRef'/>
            //        <Value Type='Text'>测试</Value>
            //    </Contains>
            //</Where>";
            #endregion

            #region 5.查询指定文件夹下的项目
            //查询指定文件夹下的项目
            query.Folder = docLib.RootFolder.SubFolders["system"];
            #endregion

 判断列表是否开启审批,列表有一个属性可以判断EnableModeration。

审批字段 _ModerationStatus

<Where><Eq><FieldRef Name='_ModerationStatus'/><Value Type='ModStat'>0</Value></Eq></Where>

0已批准,1已拒绝,2待定

<Where><Eq><FieldRef Name='_ModerationStatus'/><Value Type='Text'>已批准</Value></Eq></Where>

 

 

 <IsNull> <FieldRef Name="Status" /></IsNull>

 

//多选字段

 <Contains> <FieldRef Name='Phase' /> <Value Type='MultiChoice'>Design</Value> </Contains>

<Eq><FieldRef Name='Phase' /> <Value Type='MultiChoice'>Design</Value></Eq>

参考:

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

posted on 2015-07-02 11:42  !无名之辈  阅读(421)  评论(0)    收藏  举报