mardi 17 février 2009

[SharePoint 2007] Requêtes XPath sur les noeud XML retournés par les WebServices SharePoint

Il peut être très utile dans certains cas de communiquer avec SharePoint en utilisant ses WebServices, depuis une machine en dehors de la ferme par exemple.

Ceux-ci sont relativement simples d'utilisation lorsque vous êtes habitués à utiliser des WebServices et l'essentiel du modèle objet est exposé:
  • Administration
  • Alerts
  • Authentication
  • Copy
  • Document Workspace
  • Forms
  • Imaging
  • List Data Retrieval
  • Lists
  • Meetings
  • People
  • Permissions
  • SharePoint Directory Management
  • Site Data
  • Sites
  • Search
  • Users and Groups
  • Versions
  • Views
  • Web Part Pages
  • Webs
La référence est disponible sur MSDN: http://msdn.microsoft.com/en-us/library/cc752745.aspx

Voici un exemple d'instanciation du WebService Users and Groups:

UserGroup wsUserGroup = new UserGroup();
wsUserGroup.Credentials = System.Net.CredentialCache.DefaultCredentials;
wsUserGroup.Url = mySiteUrl + "/_vti_bin/UserGroup.asmx";


Mais attention ! Les méthodes retournent toutes des objets XmlNode qui sont dépendants de namespace URI.
Donc pour éviter de galérer avec des SelectSingleNode qui retourne null, il est nécessaire de rajouter des préfixes à vos requêtes XPath:

Exemple avec la méthode GetGroupCollectionFromSite() de mon WebService précédemment instancié qui me retourne un XmlNode du type:

<GetGroupCollectionFromSite xmlns=
"http://schemas.microsoft.com/sharepoint/soap/directory/">
<Groups>
<Group ID="3" Name="Group1" Description="Description" OwnerID="1"
OwnerIsUser="False" />
<Group ID="15" Name="Group2" Description="Description"
OwnerID="12" OwnerIsUser="True" />
<Group ID="16" Name="Group3" Description="Description"
OwnerID="7" OwnerIsUser="False" />
</Groups>
</GetGroupCollectionFromSite>


Voici donc une méthode qui déclare toutes les URI utilisées par SharePoint avec des préfixes choisis arbitrairement qui seront utilisés par nos requêtes XPath:

private XmlNodeList RunXPathQuery(XmlNode XmlNodeToQuery, string XPathQuery)
{
// load the complete XML node and all its child nodes into a XML document
XmlDocument Document = new XmlDocument();
Document.LoadXml(XmlNodeToQuery.OuterXml);

// all the possible namespaces used by SharePoint and a randomly choosen prefix
const string SharePointNamespacePrefix = "sp";
const string SharePointNamespaceURI = "http://schemas.microsoft.com/sharepoint/soap/";
const string ListItemsNamespacePrefix = "z";
const string ListItemsNamespaceURI = "#RowsetSchema";
const string PictureLibrariesNamespacePrefix = "y";
const string PictureLibrariesNamespaceURI = "http://schemas.microsoft.com/sharepoint/soap/ois/";
const string WebPartsNamespacePrefix = "w";
const string WebPartsNamespaceURI = "http://schemas.microsoft.com/WebPart/v2";
const string DirectoryNamespacePrefix = "d";
const string DirectoryNamespaceURI = "http://schemas.microsoft.com/sharepoint/soap/directory/";

// now associate with the xmlns namespaces (part of all XML nodes returned
// from SharePoint) a namespace prefix which we can then use in the queries
XmlNamespaceManager NamespaceMngr = new XmlNamespaceManager(Document.NameTable);
NamespaceMngr.AddNamespace(SharePointNamespacePrefix, SharePointNamespaceURI);
NamespaceMngr.AddNamespace(ListItemsNamespacePrefix, ListItemsNamespaceURI);
NamespaceMngr.AddNamespace(PictureLibrariesNamespacePrefix, PictureLibrariesNamespaceURI);
NamespaceMngr.AddNamespace(WebPartsNamespacePrefix, WebPartsNamespaceURI);
NamespaceMngr.AddNamespace(DirectoryNamespacePrefix, DirectoryNamespaceURI);

// run the XPath query and return the result nodes
return Document.SelectNodes(XPathQuery, NamespaceMngr);
}


Je serai donc capable d'executer des requêtes XPath sur mon noeud de la maniere suivante:

XmlNode myNode = wsUserGroup.GetGroupCollectionFromSite();
XmlNodeList myGroupList = RunXPathQuery(myNode, "/d:Groups/d:Group[@ID='16']");
Cet exemple de requête XPath me retourne les noeuds dont l'attribut ID est égale à 16.

Références:
Talk to SharePoint Through its Web Services

Aucun commentaire:

Enregistrer un commentaire