有没有简单的WASY从SharePoint GetListItems()XML输出转换为一个DataTable [英] is there any easy wasy to convert the XML output from sharepoint GetListItems() to a DataTable

查看:357
本文介绍了有没有简单的WASY从SharePoint GetListItems()XML输出转换为一个DataTable的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我能够

  com.sharepoint2.Lists名单=新名单()检索SharePoint数据; 
lists.Credentials =新System.Net.NetworkCredential(用户,PWD,域名);
lists.Url =http://sharepoint2.company.com/sites/mysite/_vti_bin/Lists.asmx;

XmlNode的ndQuery = xmlDoc.CreateNode(XmlNodeType.Element,查询,);
XmlNode的ndViewFields = xmlDoc.CreateNode(XmlNodeType.ElementViewFields,);
XmlNode的ndQueryOptions = xmlDoc.CreateNode(XmlNodeType.ElementQueryOptions,);
XmlNode的时listItems = lists.GetListItems(MYLIST,空,ndQuery,ndViewFields,空,ndQueryOptions,NULL);



我现在有我所有的数据,这个巨大的XML博客。有没有简单的方法将其转换为一个DataTable,所以我的每一行??对待这就像一个矩阵循环



我想这样的事情,但它不似乎工作:

  System.IO.StringReader SR =新System.IO.StringReader(listitems.OuterXml); 
XmlTextReader的TR = XmlTextReader的新(SR);
的DataSet DS =新的DataSet(resultDataSet);
ds.ReadXml(TR);


解决方案

啊,XML从GetListItems返回的Almos酒店一样SPListItemCollection.Xml。我有一个转换这个XML为DataTable的扩展方法。



您可以只尝试使用 ConvertZRowToRegularXml 方法上的返回的XML - 而且你会得到的DataTable理解的XML



学分的 去文森特罗斯韦尔的解决方案。

 公共静态类SPListItemCollectionExtensions 
{
公共静态只读字符串xsltFromZRowToXml =
<的xsl:样式版本= \1.0 \+
的xmlns:XSL = \http://www.w3.org/1999/XSL/Transform\+
的xmlns:S = \UUID :BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882\+
的xmlns:Z = \#RowsetSchema\>中+
< S:模式ID = \RowsetSchema\/>中+
< XSL:输出方法= \xml\省略的XML声明= \yes\/>中+
<的xsl:模板匹配= \/ \>中+
< XSL:文本禁用输出转义= \yes\>&放大器; LT;行&放大器; GT;< / XSL:文本>中+
< XSL:申请模板选择= \// Z:row\/>中+
< XSL:文本禁用输出转义= \yes\>&放大器; LT; /行和放大器; GT;< / XSL:文本>中+
< / XSL:模板>中+
<的xsl:模板匹配= \Z:row\>中+
< XSL:文本禁用输出转义= \yes\>&放大器; LT;排和放大器; GT;< / XSL:文本>中+
< XSL:申请模板选择= \@ * \/>中+
< XSL:文本禁用输出转义= \yes\>&放大器; LT; /行和放大器; GT;< / XSL:文本>中+
< / XSL:模板>中+
<的xsl:模板匹配= \@ * \>中+
< XSL:文本禁用输出转义= \yes\>&放大器; LT;< / XSL:文本>中+
<的xsl:value-of的选择= \子-后(名称(),OWS _')\/>中+
< XSL:文本禁用输出转义= \yes\>&放大器; GT;< / XSL:文本>中+
;:.\< XSL选择= \的价值,/>中+
< XSL:文本禁用输出转义= \yes\>&放大器; LT; /< / XSL:文本>中+
<的xsl:value-of的选择= \子-后(名称(),OWS _')\/>中+
< XSL:文本禁用输出转义= \yes\>&放大器; GT;< / XSL:文本>中+
< / XSL:模板>中+
< / XSL:样式>中;

公共静态数据表GetFullDataTable(此SPListItemCollection itemCollection)
{
的DataSet DS =新的DataSet();

串XMLDATA = ConvertZRowToRegularXml(itemCollection.Xml);
如果(string.IsNullOrEmpty(XMLDATA))
返回NULL;

使用(System.IO.StringReader SR =新System.IO.StringReader(XMLDATA))
{
ds.ReadXml(SR,XmlReadMode.Auto);

如果(ds.Tables.Count == 0)
返回NULL;

返回ds.Tables [0];
}
}

静态字符串ConvertZRowToRegularXml(字符串zRowData)
{
XslCompiledTransform变换=新XslCompiledTransform();
XmlDocument的tidyXsl =新的XmlDocument();


{
//变压器
tidyXsl.LoadXml(Balticovo.SharePoint.Extensions SPListItemCollectionExtensions.xsltFromZRowToXml);
transform.Load(tidyXsl);使用(TW的XmlTextWriter $ B使用
$ B //输出(结果)作家
(System.IO.StringWriter SW =新System.IO.StringWriter())
{
=新的XmlTextWriter(SW))
{
//源(输入)读者$ b $使用b(System.IO.StringReader srZRow =新System.IO.StringReader(zRowData))
{使用(XmlTextReader的xtrZRow = XmlTextReader的新(srZRow))

{
//变换
transform.Transform(xtrZRow,空,TW);
返回sw.ToString();
}
}
}
}
}

{
返回NULL;
}
}
}


i am able to retrieve data from sharepoint

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

i now have this huge XML blog with all of my data. Is there any easy way to convert this to a datatable so i treat this like a matrix to loop through each row ??

i tried something like this but it doesn't seem to work:

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

解决方案

Ahh, xml returned from GetListItems is almos the same as SPListItemCollection.Xml. I have an extension method that converts this XML into datatable.

You can just try to use ConvertZRowToRegularXml method on your returned XML - and you would get back an XML that DataTable understands.

Credits for the solution goes to Vincent Rothwell.

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

这篇关于有没有简单的WASY从SharePoint GetListItems()XML输出转换为一个DataTable的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆