Не уверен, если это необходимо, но есть больше чем один сайт sharepoint, размещенный на "website.com" (я пытаюсь получить доступ к сайту "website.com/sites/mysite").изменить вещи?
Абсолютно это делает!URL-адреса веб-служб, которые вы обнаружили, на самом деле являются виртуальными, то есть шаблон URL _vti_bin/Lists.asmx
доступен на КАЖДОМ сайте SharePoint.Независимо от того, на каком сайте находится ваш список, он должен быть отправной точкой для URL-адреса вашей веб-службы.
Таким образом, попробуйте: http://website.com/sites/mysite/_vti_bin/Lists.asmx
Возможно, вы найдете MSDN Руководство по веб-службам SharePoint статья тоже полезна.
ОБНОВЛЕНИЕ № 1:
CAML не поможет вам «разбить» ваши результаты.Это технология запросов / фильтров, и похоже, что вы используете ее надлежащим образом.Вы сами должны сказать нам, ожидаете ли вы того набора результатов, который вы получаете.Если вам нужна помощь в построении более сложных запросов CAML, я предлагаю загрузить копию CAML Query Builder U2U *1021* (но это уже другая тема).
Итак, перейдем к результатам.Это немного сбивает с толку, но в этом безумии есть какой-то метод.Все столбцы, которые вы настроили в своем списке, находятся здесь (при условии, что вы не ограничиваете их в запросе CAML, что возможно).Вы заметите, что они используют внутреннее имя SharePoint для столбца с префиксом ows_
.Итак, если вы знаете внутренние имена, вы можете создать имена атрибутов XML и использовать классы XML, LINQ или XSLT, чтобы погрузиться в результаты и получить то, что вам нужно.См. мой ответ на другой вопрос SO, в котором приведены советы по определению имен внутренних столбцов SP .
Если это поможет узнать, что я делаю в этой ситуации, я просто создаю POCO класс модели для представления одного из элементов моего списка, а также написание метода синтаксического анализа для получения результатов XML в формате SharePoint и возврата коллекции объектов модели.Мне нравится LINQ to XML для этой задачи.
Если бы вы использовали SharePoint 2010, вы могли бы использовать новые классы клиентской объектной модели и получить более управляемые оболочки для работы с сайтами SharePoint,Списки, ListItems и тому подобное.
ОБНОВЛЕНИЕ № 2:
Просто для некоторого цвета я публикую пример кода, который я использую для разбора SharePointXML.Registrant
в этом примере - класс модели POCO, который я написал для представления элемента списка SharePoint для настраиваемого списка.Это тривиально, и я не буду публиковать его.
/// <summary>
/// Parses registrant XML returned from SharePoint's Lists web service into a collection
/// of <see cref="Registrant"/> objects (root element = "listitems").
/// </summary>
/// <param name="xml">SharePoint XML</param>
/// <returns>Collection of Registrant objects, or null if no registrant data could be parsed.</returns>
public static List<Registrant> ParseSharePointXmlCollection( XElement xml ) {
// Test: Not expected XML element or has no child elements
if ( !xml.Name.LocalName.Equals( "listitems" ) || !xml.HasElements ) {
return null;
}
List<Registrant> regList = null;
XElement data = xml.Element( XName.Get( "data", "urn:schemas-microsoft-com:rowset" ) );
if ( (data != null) && (data.HasElements) ) {
regList = new List<Registrant>();
IEnumerable<XElement> regXmlNodes = data.Elements( XName.Get( "row", "#RowsetSchema" ) );
foreach (XElement regXml in regXmlNodes) {
Registrant reg = ParseSharePointXml( regXml );
if ( reg != null ) {
regList.Add( reg );
}
}
}
return regList;
}
/// <summary>
/// Parses registrant XML returned from SharePoint's Lists web service into a single
/// <see cref="Registrant"/> object (root element = "row").
/// </summary>
/// <param name="xml">SharePoint XML</param>
/// <returns>A Registrant object, or null if no registrant data could be parsed.</returns>
public static Registrant ParseSharePointXml( XElement xml ) {
// Test: Not expected XML element or has no attributes
if ( !xml.Name.LocalName.Equals( "row" ) || !xml.HasAttributes ) {
return null;
}
Registrant reg = null;
// Parse ID (if this fails, fail the whole operation)
if ( xml.Attribute( "ows_ID" ) != null ) {
reg = new Registrant();
reg.ID = xml.Attribute( "ows_ID" ).Value;
}
else {
return null;
}
// Parse First Name
if ( xml.Attribute( "ows_Q_Registrant_x0020_First_x0020_N" ) != null ) {
reg.FirstName = xml.Attribute( "ows_Q_Registrant_x0020_First_x0020_N" ).Value;
}
// Parse Last Name
if ( xml.Attribute( "ows_Q_Registrant_x0020_Last_x0020_Na" ) != null ) {
reg.LastName = xml.Attribute( "ows_Q_Registrant_x0020_Last_x0020_Na" ).Value;
}
// Parse Email
if ( xml.Attribute( "ows_Q_Registrant_x0020_Email" ) != null ) {
reg.Email = xml.Attribute( "ows_Q_Registrant_x0020_Email" ).Value;
}
// Parse Assistant Name
if ( xml.Attribute( "ows_Q_Asst_x0020_First_x0020_Name" ) != null ) {
reg.AssistantFirstName = xml.Attribute( "ows_Q_Asst_x0020_First_x0020_Name" ).Value;
}
if ( xml.Attribute( "ows_Q_Asst_x0020_Name" ) != null ) {
reg.AssistantLastName = xml.Attribute( "ows_Q_Asst_x0020_Name" ).Value;
}
// Parse Assistant Email
if ( xml.Attribute( "ows_Q_Asst_x0020_Email" ) != null ) {
reg.AssistantEmail = xml.Attribute( "ows_Q_Asst_x0020_Email" ).Value;
}
return reg;
}
ОБНОВЛЕНИЕ № 3:
Пример кода для преобразования объекта XmlNode
вXElement
:
public static XElement GetXElement( this XmlNode node ) {
XDocument xdoc = new XDocument();
using ( XmlWriter xmlWriter = xdoc.CreateWriter() ) {
node.WriteTo( xmlWriter );
}
return xdoc.Root;
}