我有以下代码,这是MSDN网站的修改版本,用于测试获取字段“UserID”与指定值匹配的所有列表项:
Dim xmlDoc = New System.Xml.XmlDocument()
Dim ndQuery As XmlNode = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "")
Dim ndViewFields As XmlNode = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "")
ndQuery.InnerXml = <Query>
<Where>
<Eq>
<FieldRef Name="UserID"/>
<Value Type="Text">Foo.Bar</Value>
</Eq>
</Where>
</Query>
ndViewFields.InnerXml = <ViewFields>
<FieldRef Name="Title"/>
<FieldRef Name="FirstName"/>
<FieldRef Name="Company"/>
<FieldRef Name="WorkPhone"/>
<FieldRef Name="HomePhone"/>
<FieldRef Name="Email"/>
<FieldRef Name="UserID"/>
</ViewFields>
我在列表中有一个带有可选UserID =“John.Doe”的项目,我按如下方式调用GetListItems:
''Gets any user from the Sharepoint New Hires list that matches the UserID variable and print to console
Dim ndListItems As XmlNode =
sharepointList.GetListItems("New Hires", Nothing, ndQuery, ndViewFields, Nothing, Nothing, Nothing)
Console.WriteLine(ndListItems.OuterXml)
我希望不会得到任何结果,因为UserID中的值不匹配,但事实证明,我确实得到了列表项,这不是我想要发生的。我不确定发生了什么。查询结构是否正确?是否有一些我不知道的参数必须包含在GetListItems函数中?以下是我在函数运行后得到的结果。
<listitems xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema" xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<rs:data ItemCount="1">
<z:row ows_ContentTypeId="0x01060051A3C5B94E00A446B900C3759422E391" ows_Title="Doe" ows_FirstName="John" ows_Email="john.doe@email.com" ows_Company="MyCompany" ows_WorkPhone="987-123-4567" ows_HomePhone="987-123-4567" ows_UserID="John.Doe" ows_ID="6" ows_ContentType="Contact" ows_Modified="2010-08-13 12:58:14" ows_Created="2010-08-13 12:58:14" ows_Author="23;#John Doe" ows_Editor="23;#John Doe" ows_owshiddenversion="1" ows_WorkflowVersion="1" ows__UIVersion="512" ows__UIVersionString="1.0" ows_Attachments="0" ows__ModerationStatus="0" ows_LinkTitleNoMenu="Doe" ows_LinkTitle="Doe" ows_SelectTitle="6" ows_Order="600.000000000000" ows_GUID="{750F74FC-1CA3-40A2-8237-CD04E0390722}" ows_FileRef="6;#Lists/NewHires/6_.000" ows_FileDirRef="6;#Lists/NewHires" ows_Last_x0020_Modified="6;#2010-08-13 12:58:14" ows_Created_x0020_Date="6;#2010-08-13 12:58:14" ows_FSObjType="6;#0" ows_PermMask="0x7fffffffffffffff" ows_FileLeafRef="6;#6_.000" ows_UniqueId="6;#{778A7804-ABAA-49DC-9061-DE050DE5F032}" ows_ProgId="6;#" ows_ScopeId="6;#{C084EB37-9260-47CD-A231-AC23477D4856}" ows__EditMenuTableStart="6_.000" ows__EditMenuTableEnd="6" ows_LinkFilenameNoMenu="6_.000" ows_LinkFilename="6_.000" ows_ServerUrl="/Lists/NewHires/6_.000" ows_EncodedAbsUrl="http://sbatsharepoint2/Lists/NewHires/6_.000" ows_BaseName="6_" ows_MetaInfo="6;#" ows__Level="1" ows__IsCurrentVersion="1" />
</rs:data>
</listitems>
更新:
仍然没有运气,我在查询中的字段类型有双引号,我用单引号替换,但是没有做任何事情。我也尝试用它的GUID替换列表名称,再没有。我已经检查了所有函数调用,有参数和变量。仍然不确定问题是什么。
UPDATE2:
尝试使用其他字段测试查询,如下所示:
ndQuery.InnerXml = <Query>
<Where>
<Eq>
<FieldRef Name="Title"/>
<Value Type="Text">Mike</Value>
</Eq>
</Where>
</Query>
当然,列表中没有Title =“Mike”的项目,但该函数仍然返回所有项目。
答案 0 :(得分:1)
对于其他任何想知道这个问题的人,我遇到了类似的问题,我的查询部分被忽略了,因为它不适用于转义引号。简单的补救方法是在查询字符串前加上@符号。
所以这个
query.InnerXml = "<Where><Eq><FieldRef Name=\"FSObjType\" />
<Value Type=\"Int\">0</Value></Eq>
</Where>";
变为
query.InnerXml = @"<Where><Eq><FieldRef Name='FSObjType' />
<Value Type='Int'>0</Value></Eq>
</Where>";
这是实现上述目标的另一种方式。
答案 1 :(得分:0)
你可以尝试这个,看看是否有帮助:
ndQuery.InnerXml = <Query>
<Where>
<Eq>
<FieldRef Name="ows_UserID"/>
<Value Type="Text">Foo.Bar</Value>
</Eq>
</Where>
</Query>
答案 2 :(得分:0)
最后,在查看this MSDN文章后,我发现我必须将查询和视域作为字符串文字传递,我观察到在MSDN上的示例中,但没想到格式有所不同,我还必须删除最外面的“&lt; \ Query&gt;”标签。以下格式最终为我工作:
''Search for items in the list with the UserID="Foo.Bar"
ndQuery.InnerXml = "<Where><Eq><FieldRef Name=""UserID"" />" + "<Value Type=""Text"">Foo.Bar</Value></Eq></Where>"
ndViewFields.InnerXml = "<FieldRef Name=""Title"" />" + "<FieldRef Name=""FirstName"" />"
我觉得奇怪的是我不能将整个查询作为字符串文字传递,但必须在“&lt; \ fieldRef&gt;”后将其分解。标签,我不知道为什么CAML会出现这种情况。对此的任何启示都表示赞赏;在这一点上,就我而言,它可能也是神奇的。