1

GetDataTable()メソッドを使用しているときに問題が発生しました。使用する結果でデフォルトのSharePoint列「FileRef」を返そうとしています。SPQuery.ViewFieldsに含めます

クエリ:

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

ViewFields:

<FieldRef Name='Title' /><FieldRef Name='Category' /><FieldRef Name='FileRef' /><FieldRef Name='ID' /><FieldRef Name='Created' />

items.XMLで返されることもわかりますが、GetDataTable()を呼び出すと、データテーブルに配置されません。

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

GetDataTableが正しく機能しないのはなぜですか?独自の変換メソッドを作成する必要がありますか?

4

3 に答える 3

1

次のコードを使用できます。SharePointのSPListItemCollectionGetDataTable()を改善して、必要なすべてのフィールドを取得しましょう

于 2009-09-28T18:08:27.990 に答える
1

より良い解決策をお勧めします

SPListItemCollectionにはすべてのアイテムデータを格納するXmlプロパティがあるため、この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;
            }
        }
    }   
}

ちなみに、この方法を使用すると、必要に応じて、前述の方法SPQuery.IncludeAttachmentUrls = trueを使用して取得する場合のように、TRUE / FALSE値だけでなく、添付ファイルのURL()を取得できます。

于 2009-09-29T14:26:29.523 に答える
1

Janisの答えについて-ows_で部分文字列を実行するビットを削除して削除しようとすると、次のようになります。-

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

SP2010には、「ows_」が含まれていないETagなどのフィールドが含まれるようになり、ソリューションが失敗するためです。そうでなければ非常に良い解決策。

于 2011-11-11T09:11:23.307 に答える