Запрос данных списка из веб-служб SharePoint

Кто-нибудь когда-либо успешно писал код для извлечения данных из списка SharePoint 2007 (в частности, библиотеки форм InfoPath) с использованием метода GetListItems () в службе http: ///_vti_bin/lists.asmx (и жил, чтобы рассказать об этом)? Он возвращает один из худших XML, которые я видел в своей жизни (это даже не совместимый XML). Есть ли простой способ проанализировать данные на C # или мне нужно будет проанализировать его вручную?

Любая помощь по этому вопросу будет принята с благодарностью.


person senfo    schedule 23.04.2009    source источник


Ответы (2)


Конечно, это не самый красивый способ делать что-то, но это просто вопрос получения правильных примеров.

Я использовал следующий код, чтобы получить "материал" из запроса на получение списков.

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, тем более что тестирование и выпуск в нашей среде само по себе стоит нескольких недель. Но иногда иного выхода нет. Например. если вы хотите получить доступ к настраиваемому пакету свойств SPWeb или создать SiteCollection с использованием определенного шаблона сайта и базы данных контента (или любого другого миллиона вещей, которые не реализованы в веб-службах). Однако для простого доступа к списку веб-службы кажутся прекрасными.

person Nat    schedule 23.04.2009
comment
Могу я задать действительно глупый вопрос? Как вы узнали об этих пространствах имен? - person senfo; 24.04.2009
comment
Да ладно, я их нашел. Они в ответе от SharePoint. - person senfo; 24.04.2009

InfoPath не может обрабатывать XML из GetListItems в веб-службе списков. В InfoPath 2007 у вас есть два варианта:

  1. Используйте подключение к данным InfoPath 2007 SharePoint, которое не позволяет фильтровать содержимое списка. Вы должны получить все содержимое обратно на клиент (или сервер, если это InfoPath Forms Services), а затем отфильтровать его в своих правилах InfoPath.
  2. Напишите веб-службу, живущую в SharePoint, которая возвращает данные в формате, который может обработать InfoPath 2007. Я делал это раньше, когда вы можете передать ему имя списка, запрос CAML и набор полей, и он вернет строки пар имя / значение. К сожалению, в настоящее время я не могу делиться этим кодом.
person Kirk Liemohn    schedule 23.04.2009
comment
Потребитель на самом деле является консольным приложением C #. Я убежден, что создание настраиваемой веб-службы, которая возвращает строго типизированную коллекцию элементов списка, будет бесконечно проще, чем собственный подход. Спасибо за ответ. - person senfo; 23.04.2009