从SharePoint Web服务查询列表数据

时间:2009-04-23 16:24:12

标签: xml web-services sharepoint caml

是否有人使用http:///_vti_bin/lists.asmx服务中的GetListItems()方法成功编写了从SharePoint 2007列表(特别是InfoPath表单库)中提取数据的代码(并告诉我们它)?它返回了我生命中看到的一些最差 XML(它甚至不符合XML)。是否有一些简单的方法来解析C#中的数据,或者我是否需要手动解析它?

对此的任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:2)

当然,这不是最漂亮的做事方式,但只需要获得正确的例子。

我使用以下代码从get list查询中获取“stuff”。

public static XmlNodeList XpathQuery(XmlNode xmlToQuery, string xPathQuery)
{
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xmlToQuery.OuterXml);
    XmlNamespaceManager mg = new XmlNamespaceManager(doc.NameTable);
    mg.AddNamespace("sp", "http://schemas.microsoft.com/sharepoint/soap/");
    mg.AddNamespace("z", "#RowsetSchema");                                   
    mg.AddNamespace("rs", "urn:schemas-microsoft-com:rowset");
    mg.AddNamespace("y", "http://schemas.microsoft.com/sharepoint/soap/ois");
    mg.AddNamespace("w", "http://schemas.microsoft.com/WebPart/v2");
    mg.AddNamespace("d", "http://schemas.microsoft.com/sharepoint/soap/directory");
    return doc.SelectNodes(xPathQuery, mg);
}

使用

调用它
    XmlNode items = lists.GetListItems(listName, string.Empty, listQuery, listViewFields, string.Empty, listQueryOptions, g.ToString());
    foreach (XmlNode listItem in SPCollection.XpathQuery(items, "//sp:listitems/rs:data/z:row"))
    {
        XmlAttribute id = listItem.Attributes["ows_Id"];
        if (id != null)
        {
            pageId = id.Value;                    
        }

    }

这个例子没有做很多,但希望它可以让你知道如何获取数据。 是的,我非常不喜欢XPathQueries的整个名称空间问题,但是你要做什么。

我对重写SharePoint Web服务并不感兴趣,特别是在我们的环境中测试和发布本身就需要花费数周的时间。但有时候,没有选择。例如。如果要访问SPWeb的自定义属性包或使用特定的站点模板和内容数据库(或Web服务中未实现的任何其他百万内容)创建SiteCollection。但是,对于简单的列表访问,Web服务看起来很好。

答案 1 :(得分:1)

InfoPath无法在列表Web服务中处理来自GetListItems的XML。使用InfoPath 2007,您有两种选择:

  1. 使用不允许过滤列表内容的InfoPath 2007 SharePoint数据连接。您必须将所有内容重新获取回客户端(或服务器,如果它是InfoPath Forms Services),然后在InfoPath规则中对其进行过滤。
  2. 编写一个位于SharePoint中的Web服务,该服务以InfoPath 2007可以摘要的格式返回数据。我之前已经完成了这个,你可以传递一个列表名称和CAML查询和字段集,它将返回名称/值对的行。不幸的是,我目前不允许分享此代码。