【问题标题】:is there any easy wasy to convert the XML output from sharepoint GetListItems() to a DataTable是否有任何简单的方法可以将 XML 输出从 sharepoint GetListItems() 转换为 DataTable
【发布时间】:2010-07-12 19:41:38
【问题描述】:

我能够从共享点检索数据

 com.sharepoint2.Lists lists = new Lists();
 lists.Credentials = new System.Net.NetworkCredential("user", "pwd", "domain");
 lists.Url = "http://sharepoint2.company.com/sites/mysite/_vti_bin/Lists.asmx";

XmlNode ndQuery = xmlDoc.CreateNode(XmlNodeType.Element, "Query", "");
XmlNode ndViewFields = xmlDoc.CreateNode(XmlNodeType.Element, "ViewFields", "");
XmlNode ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.Element, "QueryOptions", "");
XmlNode listitems = lists.GetListItems("MyList", null, ndQuery, ndViewFields, null,ndQueryOptions, null);

我现在拥有一个包含我所有数据的大型 XML 博客。有什么简单的方法可以将它转换为数据表,所以我把它当作一个矩阵来循环遍历每一行??

我尝试了类似的方法,但它似乎不起作用:

System.IO.StringReader sr = new System.IO.StringReader(listitems.OuterXml);
XmlTextReader tr = new XmlTextReader(sr);
DataSet ds = new DataSet("resultDataSet");
ds.ReadXml(tr);

【问题讨论】:

  • 我猜对了,您使用的是 Web 服务,而不是对象模型?
  • @Panagiotis Kanavos - 是的,我正在使用网络服务(老实说,我不明白你所说的“使用对象模型”是什么意思)
  • 在线共享点不允许部署 wsp 解决方案包和功能吗?

标签: c# sharepoint datatable xmlnode


【解决方案1】:

啊,从 GetListItems 返回的 xml 与 SPListItemCollection.Xml 几乎相同。我有一个将此 XML 转换为数据表的扩展方法。

您可以尝试在返回的 XML 上使用 ConvertZRowToRegularXml 方法 - 您将返回 DataTable 可以理解的 XML。

the solution 的功劳归文森特·罗斯威尔所有。

public static class SPListItemCollectionExtensions
    {
        public static readonly string xsltFromZRowToXml =
                "<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(Balticovo.SharePoint.Extensions. SPListItemCollectionExtensions.xsltFromZRowToXml);
                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;
            }
        }
    }   

【讨论】:

  • 我在这里发现了一个问题。如果列名中有“/”,则该列中的所有数据似乎都返回空白。更糟糕的是,我从列标题中删除了“/”,但在从 Web 服务下载时它们仍然显示
【解决方案2】:

您应该像这样将 XmlNodeType 传递给 XmlTextReader:

DataSet ds=new DataSet();
using(var reader=new XmlTextReader(listItems.OuterXml,XmlNodeType.Element,null))
{
    ds.ReadXml(reader);
}

关于对象模型与 Web 服务:创建 Web 部件、事件接收器等的常用方法是使用 Sharepoint 的服务器对象模型。 Web 服务的使用并不多,因为它们有点麻烦。在 Sharepoint 2010 中,一个新的客户端对象模型和 WCF 数据服务使事情变得更加容易,并且旧的 ASMX Web 服务被认为已弃用。

但是 Sharepoint Online 实际上是 2007 版本,不允许使用服务器端代码,因此 AJAX 和 ASMX Web 服务是自定义 Sharepoint Online 站点并与之通信的唯一方法。这使得 ASMX 服务在它们被弃用时被推到了前面。去图吧。

【讨论】:

    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    相关资源
    最近更新 更多