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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439223.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode - 1765】. 地图中的最高点

力扣 解题报告&#xff1a; 多元BFS。 进阶一下&#xff1a; 二维数组&#xff0c;1表示等高线&#xff0c;0表示平地&#xff0c;比如 输入 010 111 010 输出 010 121 010输入 010 101 010 输出 010 111 010即输入一个二维地图&#xff0c;保证等高线一定是闭合的环&#x…

Linq找不到行或行已更改

1.debug确认&#xff0c;待修改记录已经正确定位&#xff0c;各字段均已正确赋值 2.最后发现原来是Linq使用的表实际中有个字段&#xff0c;数据库中为Nullable&#xff0c;而dbml是Not Nullable&#xff0c;二者不一致 一个逻辑是&#xff0c;我现在填写的是非空值&#xff…

【LeetCode - 32】最长有效括号

给你一个只包含 ( 和 ) 的字符串&#xff0c;找出最长有效&#xff08;格式正确且连续&#xff09;括号子串的长度。 示例 1&#xff1a; 输入&#xff1a;s "(()" 输出&#xff1a;2 解释&#xff1a;最长有效括号子串是 "()" 示例 2&#xff1a; 输入…

【转】微服务架构下分布式事务方案

1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单、松耦合的服务&#xff0c;这样可以降低开发难度、增强扩展性、便于敏捷开发。当前被越来越多的开发者推崇&#xff0c;很多互联网行业巨头、开源社区等都开始了微服务的讨论和实践。Hailo有160个不同服务构成…

【LeetCode - 443】压缩字符串(模拟)

解题报告&#xff1a; 直接模拟。 class Solution { public:int compress(vector<char>& chars) {int p 0;for(int i 0; i<chars.size();) {int j i1;while(j<chars.size() && chars[j] chars[i]) j;chars[p] chars[i];if(j-i > 1) {int cnt…

Linq to SQL之使用事务

事务是一个原子的工作单位&#xff0c;必须完整的完成单位里的所有工作&#xff0c;要么全部执行&#xff0c;要么全部都不执行。如果提交事务&#xff0c;则事务执行成功&#xff1b;如果回滚事务&#xff0c;则事务执行失败。 事务具备4个基本特性--ACID(原子性、一致性、孤立…

【LeetCode - 798】得分最高的最小轮调(转化法)

解题报告&#xff1a; 思路一&#xff1a;这题首先说一个nlogn的方法。 首先一个主客转化&#xff0c;题目描述是说把数组做翻转&#xff0c;idx不变&#xff0c;然后nums[i]和i作比较。那么我们可以转化为让数组不变&#xff0c;idx转变&#xff0c;即&#xff1a;假设刚开始…

【转】聊聊分布式事务,再说说解决方案

前言 最近很久没有写博客了&#xff0c;一方面是因为公司事情最近比较忙&#xff0c;另外一方面是因为在进行 CAP 的下一阶段的开发工作&#xff0c;不过目前已经告一段落了。 接下来还是开始我们今天的话题&#xff0c;说说分布式事务&#xff0c;或者说是我眼中的分布式事务…

【LeetCode - 2049】统计最高分的节点数目

解题报告&#xff1b; 直接dp。注意mx也得longlong AC代码&#xff1a; class Solution { public:vector<int> vv[200005];int sum[200005];long long ans[200005];int n;void dfs(int x) {ans[x] 1; sum[x] 1;for(int i 0; i<vv[x].size(); i) {dfs(vv[x][i]);s…

Web Service 实现分布式事务

首先要声明&#xff0c;不推荐在web service中实现分布式事务。 原因如下&#xff1a;   1、webservice在通信层上是一种无连接的协议&#xff0c;每两次调用之间&#xff0c;tcp连接是断开的。而分布式事务需要保存事务上下文&#xff0c;这是一个难点   2、web service是…

【LeetCode每日一题】2024. 考试的最大困扰度

​​​​​​力扣 解题报告&#xff1a; 因为只有T和F两个元素&#xff0c;不难证明单向性。尺取法解决。当然这题也可以二分。 AC代码&#xff1a; class Solution { public:int maxConsecutiveAnswers(string answerKey, int k) {int l 0, r 0;int T 0, F 0;int ans …

使用WebService如何实现分布式事务

在 System.EnterpriseServices 名称空间中实现了COM服务的相关类&#xff0c;其中就提供事务支持。 你可以在你的方法上加上TransactionAttribute特性标记&#xff0c;那个方法就支持事务了。 然后在那个方法中就可以用ContextUtil.SetComplete()和ContextUtil.SetAbort()方法分…

【Leetcode - 172】阶乘后的零(思维)

给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;0 解释&#xff1a;3! 6 &#xff0c;不含尾随 0 示例 2&#xff1a; 输入&#xff1a;n 5 输出&…

linq、lambda、entity framework之间的关系

lambda&#xff1a; 一种匿名委托的精简版写法&#xff0c;明显的标志是>符号 entity framework&#xff08;简称EF&#xff09;&#xff1a; 微软访问数据库的最快捷最成熟的框架&#xff08;ORM&#xff09;&#xff0c;在EF出现以前有SqlHelper、NHibernate等访问数据库…

2022-08-20-网易笔试题

写在前面 题目收集来源自网络&#xff0c;前四题是开发岗的&#xff0c;后四题是算法岗的&#xff0c;因为代码无处提交&#xff0c;不一定正确&#xff0c;就不贴出来了&#xff0c;这里只写一下我的思路吧~欢迎大家一起讨论~~ 1、 思路&#xff1a;因为最大1e9&#xff0c…

TUN/TAP设备浅析(一) -- 原理浅析

TUN/TAP设备浅析 TUN设备 TUN 设备是一种虚拟网络设备&#xff0c;通过此设备&#xff0c;程序可以方便地模拟网络行为。TUN 模拟的是一个三层设备,也就是说,通过它可以处理来自网络层的数据&#xff0c;更通俗一点的说&#xff0c;通过它&#xff0c;我们可以处理 IP 数据包…

2022-08-21 星环科技-C++开发笔试

1、 思路&#xff1a;拓扑排序&#xff0c;不解释了 2、 思路&#xff1a; 本来以为他是一个图论问题&#xff0c;找最大环。 但其实对于这种情况&#xff0c;他是要输出0的&#xff0c;而不是9&#xff0c;所以他不是一个图论问题&#xff0c;他带有顺序性&#xff0c;这种可…

TUN/TAP设备浅析(二) -- TUN/TAP的编程

这篇文章想详细阐述一下有关于 TUN/TAP 设备的编程。 其实关于这两种设备的编程&#xff0c;基本上属于八股文&#xff0c;大家一般都这么干。 启动设备之前 有的linux 并没有将tun 模块编译到内核之中&#xff0c;所以&#xff0c;我们要做的第一件事情就是检查我们的系统是…

【算法练习题】位运算(贪心)

题目&#xff1a; 解题报告&#xff1a; 首先预备几个结论&#xff1a; 1、对于两个数a,b &#xff0c;生成a&b和a|b&#xff0c;则一定对应一个常数c&#xff0c;使得生成的两个数分别是ac和a-c。 2、对于两个数a,b&#xff0c;生成a&b和a|b的前后&#xff0c;二进…

TUN/TAP设备浅析(三) -- TUN/TAP设备的应用

上一篇文章主要讲述了TUN/TAP设备的一些原理&#xff0c;你可能会好奇&#xff0c;TUN/TAP设备究竟有什么用处呢&#xff1f;所以这篇文章&#xff0c;我想用一些实际的例子来回答这个问题。 例子源自陈硕老师的博客&#xff0c;博文中关于TUN/TAP设备的使用非常典型&#xff…