Bonjour,

Je tente de faire un client CalDAV.

Pour se faire, je me connecte au serveur (Zimbra en l'occurence) et je lui demande de m'envoyer la liste des URL des différents objets disponibles, afin de récupérer l'adresse du calendrier (Calendar).

Je reçois le flux XML suivant (les [...] sont là pour éviter de vous poster le fichier en entier, le flux XML est valide.

Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<D:multistatus xmlns:D=\"DAV:\">
  <D:response>
	<D:href>/dav/xxx.yyy@zzz.eu/</D:href>
	<D:propstat>
		<D:status>HTTP/1.1 200 OK</D:status>
		<D:prop>
			<D:displayname>USER_ROOT</D:displayname>
		</D:prop>
    </D:propstat>
  </D:response>
[...]
  <D:response>
    <D:href>/dav/xxx.yyy@zzz.eu/Calendar/</D:href>
    <D:propstat>
      <D:status>HTTP/1.1 200 OK</D:status>
      <D:prop>
        <D:displayname>Calendar</D:displayname>
      </D:prop>
    </D:propstat>
  </D:response>
[...]
</D:multistatus>

Et voici mon code :
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
            string response = SendQuery("PROPFIND", "<?xml version=\"1.0\"?><D:propfind xmlns:D=\"DAV:\"><D:prop><D:displayname/></D:prop></D:propfind>", RootAddress);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(response);
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("D", "DAV:");
            return new Uri(string.Concat(BaseAddress.OriginalString, doc.SelectSingleNode(string.Format("/D:multistatus/D:response[D:propstat/D:prop/D:displayname = '{0}']/D:href", name), nsmgr).InnerText));

Le "SelectSingleNode" plante, avec un XPathException.

Qu'est-ce qui ne va pas ?

Voici la chaîne telle qu'elle est passée (string.Format décodé) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
/D:multistatus/D:response[D:propstat/D:prop/D:displayname = 'Calendar']/D:href
J'ai essayé, pous debug :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
doc.SelectSingleNode("/", nsmgr);
Ça marche (retourne le document entier).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
doc.SelectSingleNode("/D:multistatus", nsmgr);
Ça plante. Même erreur.
J'en déduit que c'est donc le namespace "D:" qui fout le boxon. Pourtant, je pense l'avoir correctement déclaré non ?
Code csharp : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
            XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
            nsmgr.AddNamespace("D", "DAV:");