Sharepoint SPListItemCollection.GetDataTable()不';不返回所有列?

Sharepoint SPListItemCollection.GetDataTable()不';不返回所有列?,sharepoint,caml,Sharepoint,Caml,我在使用GetDataTable()方法时遇到了一个问题。我正在尝试返回结果中要使用的默认SharePoint列“FileRef”。我将其包括在我的SPQuery.ViewFields中 查询: <Where><IsNotNull><FieldRef Name='FileRef'/></IsNotNull></Where> 为什么GetDataTable不能正常工作?我是否必须编写自己的转换方法?您可以使用以下代码:我建议您使用更好的

我在使用GetDataTable()方法时遇到了一个问题。我正在尝试返回结果中要使用的默认SharePoint列“FileRef”。我将其包括在我的SPQuery.ViewFields中

查询:

<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\">&lt;rows&gt;</xsl:text>" +
              "<xsl:apply-templates select=\"//z:row\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;/rows&gt;</xsl:text>" +
             "</xsl:template>" +

             "<xsl:template match=\"z:row\">" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;row&gt;</xsl:text>" +
              "<xsl:apply-templates select=\"@*\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;/row&gt;</xsl:text>" +
             "</xsl:template>" +

             "<xsl:template match=\"@*\">" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;</xsl:text>" +
              "<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&gt;</xsl:text>" +
              "<xsl:value-of select=\".\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;/</xsl:text>" +
              "<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&gt;</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\">&lt;rows&gt;</xsl:text>" +
              "<xsl:apply-templates select=\"//z:row\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;/rows&gt;</xsl:text>" +
             "</xsl:template>" +

             "<xsl:template match=\"z:row\">" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;row&gt;</xsl:text>" +
              "<xsl:apply-templates select=\"@*\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;/row&gt;</xsl:text>" +
             "</xsl:template>" +

             "<xsl:template match=\"@*\">" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;</xsl:text>" +
              "<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&gt;</xsl:text>" +
              "<xsl:value-of select=\".\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&lt;/</xsl:text>" +
              "<xsl:value-of select=\"substring-after(name(), 'ows_')\"/>" +
              "<xsl:text disable-output-escaping=\"yes\">&gt;</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()\"/>" +