SHAREPOINT - CAML列表查询
首先要了解的是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&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>";
时间的相关处理:
如果要拿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
SHAREPOINT - CAML列表查询的更多相关文章
- [总结]SHAREPOINT - CAML列表查询(上)
首先要了解的是CAML(Collaboration Application Markup Language)不仅仅是用在对列表.文档库的查询,字段的定义,站点定义等处处使用的都是CAML. 简单的提一 ...
- SharePoint中跨列表查询
1,最近的项目中遇到一个需求,站点中有几十个列表,其中每5,6个列表属于一个模块下的.客户的需求是,首页上显示一个模块下所有列表数据的前5条,并按创建时间排序. 2,刚刚考虑到这块的实现方法时,用的是 ...
- SharePoint 2013 列表多表联合查询
在SharePoint的企业应用中,遇到复杂的逻辑的时候,我们会需要多表查询:SharePoint和Sql数据表一样,也支持多表联合查询,但是不像Sql语句那样简单,需要使用SPQuery的Joins ...
- SharePoint 2013 列表关于大数据的测试<二>
1.给测试列表添加查阅项字段,100个,代码如下: 2.插入测试数据的方法,注意查阅项字段的格式,代码如下: 3.插入10w条数据,时间花费如下(不建议List[LISTNAME].Items.Add ...
- Sharepoint 2013列表视图和字段权限扩展插件(免费下载)!
记得2014年春节期间,有博客园的网友通过QQ向我咨询Sharepoint 2013列表视图和字段权限扩展,因为之前他看到我博客介绍Sharepoint 2010列表视图和字段的权限控制扩展使用,问有 ...
- sharepoint 2013 列表和库标签 元数据导航配置(2)
接前面提到的,如何创建一个术语库.sharepoint 2013 列表和库标签 元数据导航配置(1), 现在要做的,就是如何在自定义或者文档库中使用这个术语库,实现标签功能,通过这些标签,找到对应的文 ...
- SharePoint CAML In Action——Part II
在SharePoint中,相对于Linq to SharePoint而言,CAML是轻量化的.当然缺点也是显而易见的,"Hard Code"有时会让你抓狂.在实际场景中,经常会根据 ...
- SharePoint CAML In Action——Part I
在SharePoint中,我们经常要对List进行操作,比如要从List中取出相应的ListItem,利用CAML是个好办法.在没了解CAML之前,我是这样取数据的: MyList.Items.Cas ...
- SharePoint 创建列表并使用Windows Presentation Foundation应用程序管理列表
SharePoint创建列表并使用程序管理列表 列表是SharePoint开发者输入数据的方式之中的一个.使用Web界面创建一个列表并加入一些数据.过程例如以下: 1. 打开站点. 2 ...
随机推荐
- CMD窗口如何调整大小 / 颜色
Windows默认的命令行工具CMD暴丑无比..很多人都会因为这个原因去寻找漂亮的命令行工具.. 但是很多所谓的命令行工具并不能完美的支持到CMD.. 譬如 PowerCMD 或 Cmder 之流.. ...
- 在IE6、IE7中实现块元素的inline-block效果
在IE6.IE7中实现块元素的inline-block效果有以下两种方法: 1先使用display:inline-block属性触发layout,然后再定义display:inline让块元素呈现内联 ...
- ASP.NET中最保险最环保的返回404的方法
代码如下: Response.StatusCode = 404; Response.SuppressContent = true; Context.ApplicationInstance.Comple ...
- php正则表达式匹配用户名规则:由字母开头的6-16位字母和数字组成的字符串
$pattern = '/^[a-zA-Z]{1}[a-zA-Z0-9]{5,15}$/i';
- CF451C Predict Outcome of the Game 水题
Codeforces Round #258 (Div. 2) Predict Outcome of the Game C. Predict Outcome of the Game time limit ...
- 一起找bug
帮同学找的一个bug,错误代码如下: package dai_test; public class Test1 { public static void main(String[] args) { / ...
- C++你不知道的那些事儿—C++语言的15个晦涩特性
这个列表收集了 C++ 语言的一些晦涩(Obscure)特性,是我经年累月研究这门语言的各个方面收集起来的.C++非常庞大,我总是能学到一些新知识.即使你对C++已了如指掌,也希望你能从列表中学到一些 ...
- spark在windows下的安装
Windows下最简的开发环境搭建这里的spark开发环境, 不是为apache spark开源项目贡献代码, 而是指基于spark的大数据项目开发. Spark提供了2个交互式shell, 一个 ...
- VTK初学一,Pro文件的配置
1. pro文件的配置 TEMPLATE = app CONFIG += console CONFIG -= app_bundle CONFIG += qt QT += core gui greate ...
- AlwaysOn可用性组功能测试(一)--AlwaysOn故障转移测试
具体测试环境请参考: AlwaysOn可用性组测试环境安装与配置(一)--SQL群集环境搭建 AlwaysOn可用性组测试环境安装与配置(二)--AlwaysOn配置(界面与T-SQL) 一. Alw ...