SharePoint列表,GetListItems,XML和VBA - 我只想进行交叉引用!

时间:2009-01-15 00:55:04

标签: xml sharepoint vba

我有一个SharePoint列表,其中包括两个我关心的列;在Excel-ese中,我想匹配第1列中的值X,并返回第2列中的相应值。我可以使用http://guruj.net/node/63处的变体代码来检索信息(我想),所以我认为我的问题主要集中在没有下载DLL的情况下在VBA中导航XML(我确实有一堆MSXML?.DLLs,2,2.6,3,4,5,6)。

我发现最接近的MSDN文章引用了.NET(我陷入了Office 2003附带的VBA / VB6)或可下载的DLL。

Nat在下面的回答概述了我发现或需要的大部分内容但是就像我发现它的语言错误一样,我的问题的一部分就是找到搜索词。我已经将一些翻译混为一谈,例如,XMLDocument似乎是DOMDocument,但XML部分是IXMLDOMNode或类似的。

我目前遇到的主要问题是我在SOAP调用上遇到类型不匹配以执行查询,或者当我尝试重铸播放器时对象不支持该方法(listQuery,listViewFields,listQueryOptions )。我把各个部分保留为变体,然后将它们转换为返回的类型(因为我没有引用SP特定的库,我这样做有点盲目)并且得到了不匹配。

看起来世界更容易筛选文字。

1 个答案:

答案 0 :(得分:4)

哇,你到了兔子洞那么远......

好的,您正在查看的代码是为您提供SharePoint列表的视图,这可能不是最好的起点,但事实上它在VBA中完成所有这些都非常困难。我有.NET C#代码来查询列表并检索具有特定值的项目。我无法做的VBA转换。

public static string GetPageId(string listName, string webPath, string pageTitle)
    {
        string pageId = "";
        IntranetLists.Lists lists = new IntranetLists.Lists();
        lists.UseDefaultCredentials = true;
        lists.Url = webPath + "/_vti_bin/lists.asmx";
        XmlDocument doc = new XmlDocument();
        doc.LoadXml("<Document><Query><Where><Contains><FieldRef Name=\"Title\" /><Value Type=\"Text\">" + pageTitle + "</Value></Contains></Where></Query><ViewFields /><QueryOptions /></Document>");
        XmlNode listQuery = doc.SelectSingleNode("//Query");
        XmlNode listViewFields = doc.SelectSingleNode("//ViewFields");
        XmlNode listQueryOptions = doc.SelectSingleNode("//QueryOptions");

        Guid g = GetWebID(webPath);

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

        }
        return pageId;            
    }

IntranetLists是lists.asmx文件的.net Web引用。

您必须研究如何在VBA中使用lists.asmx Web服务, 然后,您必须使用表示要查找的列值的查询来调用GetListItems。

<Where><Contains><FieldRef Name="Title" /><Value Type="Text">MyValue</Value></Contains></Where>

该查询的语法为CAML

然后你将不得不解析返回的xml以找到具有所需值的项目和项目字段。 任何xpath查询都必须添加正确的名称空间,例如

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

但是我不确定您是否可以访问在您的VBA设置中解析xml的内容,因此您可能需要下载一些额外的VBA工具来执行此操作 - 甚至可能会阻止您。

希望这有点帮助。