2009-09-28 76 views
1

我在使用GetDataTable()方法时遇到了一个问题。我试图在我的结果中使用默认的SharePoint列“FileRef”。包括我在我的SPQuery.ViewFieldsSPListItemCollection.GetDataTable()不会返回所有列?

查询:

<Where><IsNotNull><FieldRef Name='FileRef'/></IsNotNull></Where> 

ViewFields:

我甚至可以看到它返回的items.XML但是当我打电话GetDataTable()是没有放在数据表中。

SPListItemCollection items = list.GetItems(spq); 
dtItems = items.GetDataTable(); 

为什么不GetDataTable正常工作?我将不得不编写自己的转换方法吗?

回答

1

我建议你一个更好的解决方案

由于SPListItemCollection具有存储所有项目数据的XML的广告载体,可以使用this XSLT获得正常的XML格式的数据和然后从XML创建DataSet。

这个想法可以被转换成方便的扩展功能:使用此方法

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; 
      } 
     } 
    } 
} 

顺便问一下,你会得到,如果需要的话,文件附件的URL(SPQuery.IncludeAttachmentUrls = true)不只是TRUE/FALSE值作为你将通过使用previously mentioned method得到它。

1

关于Janis的答案 - 我会删除该做的一个子上ows_位,并试图将其删除,只需使用: -

"<xsl:value-of select=\"name()\"/>" + 

因为现在SP2010领域包括诸如ETag的其中唐” t与“ows_”并且解决方案失败。否则很好的解决方案。