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&p_ID=5" xmlns:rs="urn:schemas-microsoft-com:rowset">
在查询的时候通过指定QueryOptions选项相应设置可以查询指定页的内容,接上面的例子,通过:<Paging
ListItemCollectionPositionNext='Paged=TRUE&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>
参考:
使用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
浙公网安备 33010602011771号