Sharepoint SPListItemCollection.GetDataTable()不';不返回所有列?
我在使用GetDataTable()方法时遇到了一个问题。我正在尝试返回结果中要使用的默认SharePoint列“FileRef”。我将其包括在我的SPQuery.ViewFields中 查询:Sharepoint SPListItemCollection.GetDataTable()不';不返回所有列?,sharepoint,caml,Sharepoint,Caml,我在使用GetDataTable()方法时遇到了一个问题。我正在尝试返回结果中要使用的默认SharePoint列“FileRef”。我将其包括在我的SPQuery.ViewFields中 查询: <Where><IsNotNull><FieldRef Name='FileRef'/></IsNotNull></Where> 为什么GetDataTable不能正常工作?我是否必须编写自己的转换方法?您可以使用以下代码:我建议您使用更好的
<Where><IsNotNull><FieldRef Name='FileRef'/></IsNotNull></Where>
为什么GetDataTable不能正常工作?我是否必须编写自己的转换方法?您可以使用以下代码:我建议您使用更好的解决方案 由于SPListItemCollection具有存储所有项数据的Xml ProeProperty,因此可以使用来获取普通Xml格式的数据,然后从Xml创建数据集 这个想法可以转化为方便的扩展功能:
using System.Data;
using System.Xml;
using System.Xml.Xsl;
using Microsoft.SharePoint;
namespace Balticovo.SharePoint
{
public static partial class Extensions
{
static string sFromRowsetToRegularXmlXslt =
"<xsl:stylesheet version=\"1.0\" " +
"xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" " +
"xmlns:s=\"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882\" " +
"xmlns:z=\"#RowsetSchema\">" +
"<s:Schema id=\"RowsetSchema\"/>" +
"<xsl:output method=\"xml\" omit-xml-declaration=\"yes\" />" +
"<xsl:template match=\"/\">" +
"<xsl:text disable-output-escaping=\"yes\"><rows></xsl:text>" +
"<xsl:apply-templates select=\"//z:row\"/>" +
"<xsl:text disable-output-escaping=\"yes\"></rows></xsl:text>" +
"</xsl:template>" +
"<xsl:template match=\"z:row\">" +
"<xsl:text disable-output-escaping=\"yes\"><row></xsl:text>" +
"<xsl:apply-templates select=\"@*\"/>" +
"<xsl:text disable-output-escaping=\"yes\"></row></xsl:text>" +
"</xsl:template>" +
"<xsl:template match=\"@*\">" +
"<xsl:text disable-output-escaping=\"yes\"><</xsl:text>" +
"<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" +
"<xsl:text disable-output-escaping=\"yes\">></xsl:text>" +
"<xsl:value-of select=\".\"/>" +
"<xsl:text disable-output-escaping=\"yes\"></</xsl:text>" +
"<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" +
"<xsl:text disable-output-escaping=\"yes\">></xsl:text>" +
"</xsl:template>" +
"</xsl:stylesheet>";
public static DataTable GetFullDataTable(this SPListItemCollection itemCollection)
{
DataSet ds = new DataSet();
string xmlData = ConvertZRowToRegularXml(itemCollection.Xml);
if (string.IsNullOrEmpty(xmlData))
return null;
using (System.IO.StringReader sr = new System.IO.StringReader(xmlData))
{
ds.ReadXml(sr, XmlReadMode.Auto);
if (ds.Tables.Count == 0)
return null;
return ds.Tables[0];
}
}
static string ConvertZRowToRegularXml(string zRowData)
{
XslCompiledTransform transform = new XslCompiledTransform();
XmlDocument tidyXsl = new XmlDocument();
try
{
//Transformer
tidyXsl.LoadXml(Extensions.sFromRowsetToRegularXmlXslt);
transform.Load(tidyXsl);
//output (result) writers
using (System.IO.StringWriter sw = new System.IO.StringWriter())
{
using (XmlTextWriter tw = new XmlTextWriter(sw))
{
//Source (input) readers
using (System.IO.StringReader srZRow = new System.IO.StringReader(zRowData))
{
using (XmlTextReader xtrZRow = new XmlTextReader(srZRow))
{
//Transform
transform.Transform(xtrZRow, null, tw);
return sw.ToString();
}
}
}
}
}
catch
{
return null;
}
}
}
}
使用系统数据;
使用System.Xml;
使用System.Xml.Xsl;
使用Microsoft.SharePoint;
名称空间:covo.SharePoint
{
公共静态部分类扩展
{
静态字符串sfromrowsetoregularxmlxslt=
"" +
"" +
"" +
"" +
“行”+
"" +
“/行”+
"" +
"" +
“行”+
"" +
“/行”+
"" +
"" +
"" +
"" +
"" +
"" +
"/" +
"" +
"" +
"" +
"";
公共静态数据表GetFullDataTable(此SPListItemCollection itemCollection)
{
数据集ds=新数据集();
字符串xmlData=ConvertZRowToRegularXml(itemCollection.Xml);
if(string.IsNullOrEmpty(xmlData))
返回null;
使用(System.IO.StringReader sr=new System.IO.StringReader(xmlData))
{
ReadXml(sr,XmlReadMode.Auto);
如果(ds.Tables.Count==0)
返回null;
返回ds.表[0];
}
}
静态字符串转换器ZrowToRegularXML(字符串zRowData)
{
XslCompiledTransform transform=新的XslCompiledTransform();
XmlDocument tidyXsl=新的XmlDocument();
尝试
{
//变压器
LoadXml(Extensions.sfromrowsetoregularxmlxslt);
transform.Load(tidyXsl);
//输出(结果)写入程序
使用(System.IO.StringWriter sw=new System.IO.StringWriter())
{
使用(XmlTextWriter tw=新的XmlTextWriter(sw))
{
//源(输入)读取器
使用(System.IO.StringReader srZRow=new System.IO.StringReader(zRowData))
{
使用(XmlTextReader xtrZRow=新的XmlTextReader(srZRow))
{
//转化
transform.transform(xtrZRow,null,tw);
返回sw.ToString();
}
}
}
}
}
抓住
{
返回null;
}
}
}
}
顺便说一下,使用此方法,如果需要,您将获得文件附件URL(
SPQuery.IncludeAttachmentUrls=true
),而不仅仅是您使用时获得的真/假值。关于Janis的答案-我会删除在ows上执行子字符串的位并尝试删除它,只需使用:-
"<xsl:value-of select=\"name()\"/>" +
“”+
因为SP2010现在包含ETag等字段,这些字段不与“ows_u2;”一起使用,因此解决方案失败。非常好的解决方案。谢谢。。。我想这回答了我的问题,这个函数并没有返回所有的字段。我试图避免重写这个。
using System.Data;
using System.Xml;
using System.Xml.Xsl;
using Microsoft.SharePoint;
namespace Balticovo.SharePoint
{
public static partial class Extensions
{
static string sFromRowsetToRegularXmlXslt =
"<xsl:stylesheet version=\"1.0\" " +
"xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" " +
"xmlns:s=\"uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882\" " +
"xmlns:z=\"#RowsetSchema\">" +
"<s:Schema id=\"RowsetSchema\"/>" +
"<xsl:output method=\"xml\" omit-xml-declaration=\"yes\" />" +
"<xsl:template match=\"/\">" +
"<xsl:text disable-output-escaping=\"yes\"><rows></xsl:text>" +
"<xsl:apply-templates select=\"//z:row\"/>" +
"<xsl:text disable-output-escaping=\"yes\"></rows></xsl:text>" +
"</xsl:template>" +
"<xsl:template match=\"z:row\">" +
"<xsl:text disable-output-escaping=\"yes\"><row></xsl:text>" +
"<xsl:apply-templates select=\"@*\"/>" +
"<xsl:text disable-output-escaping=\"yes\"></row></xsl:text>" +
"</xsl:template>" +
"<xsl:template match=\"@*\">" +
"<xsl:text disable-output-escaping=\"yes\"><</xsl:text>" +
"<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" +
"<xsl:text disable-output-escaping=\"yes\">></xsl:text>" +
"<xsl:value-of select=\".\"/>" +
"<xsl:text disable-output-escaping=\"yes\"></</xsl:text>" +
"<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" +
"<xsl:text disable-output-escaping=\"yes\">></xsl:text>" +
"</xsl:template>" +
"</xsl:stylesheet>";
public static DataTable GetFullDataTable(this SPListItemCollection itemCollection)
{
DataSet ds = new DataSet();
string xmlData = ConvertZRowToRegularXml(itemCollection.Xml);
if (string.IsNullOrEmpty(xmlData))
return null;
using (System.IO.StringReader sr = new System.IO.StringReader(xmlData))
{
ds.ReadXml(sr, XmlReadMode.Auto);
if (ds.Tables.Count == 0)
return null;
return ds.Tables[0];
}
}
static string ConvertZRowToRegularXml(string zRowData)
{
XslCompiledTransform transform = new XslCompiledTransform();
XmlDocument tidyXsl = new XmlDocument();
try
{
//Transformer
tidyXsl.LoadXml(Extensions.sFromRowsetToRegularXmlXslt);
transform.Load(tidyXsl);
//output (result) writers
using (System.IO.StringWriter sw = new System.IO.StringWriter())
{
using (XmlTextWriter tw = new XmlTextWriter(sw))
{
//Source (input) readers
using (System.IO.StringReader srZRow = new System.IO.StringReader(zRowData))
{
using (XmlTextReader xtrZRow = new XmlTextReader(srZRow))
{
//Transform
transform.Transform(xtrZRow, null, tw);
return sw.ToString();
}
}
}
}
}
catch
{
return null;
}
}
}
}
"<xsl:value-of select=\"name()\"/>" +