XML et versions

Samedi 29 janvier 2005 20:29 - Code

API et ABI, mamelles de la compatibilité, tant de fois négligées. Mais ce n'est pas la complainte du jour. Aujourd'hui, j'étends la compatibilité aux données échangées et à leur format, une fois de plus XML.

Application A et application B s'échangent des données, des messages au format XML. Ils sont normalisés, tout ça, très bien. Nouvelle version de la norme, quelques modifications, comment s'assurer que l'application A, mise à jour, continuera à gérer correctement les messages reçus de B, qui n'a pas encore été mise au goût du jour ?

Simple. Le nœud principal du document possèdera un attribut Version (éventuellement décomposé en MajorVersion et MinorVersion). Arrive un message dont la version est inférieure ? Emballé, pesé, il suffit de regarder à ces attributs et le bon traitement peut être appliqué.

Comment fait-on pour atteindre cet attribut Version ? Dans les cas simples, c'est simple. Dans les cas compliqués, par exemple si le document est en fait transporté dans une requête SOAP, la réponse XML est XPath, qui permet de faire /soap:Envelope/soap:Body/samlp:Request/@MajorVersion (lu à l'envers, l'attribut MajorVersion du nœud samlp:Request qui se trouve dans le nœud soap:Body qui se trouve dans le nœud soap:Envelope).

Mais. Il y a évidemment un mais. Les nœuds XML sont qualifiés par leur nom mais aussi leur namespace, Request est le nom, samlp est le namespace. Pour compliquer un peu cela, samlp n'est en fait pas le namespace mais un pointeur vers une URI désignant le namespace. Passons à l'HTML bien connu et regardons:

<html xmlns="http://www.w3.org/1999/xhtml"/>
<html:html xmlns:html="http://www.w3.org/1999/xhtml"/>
<toto:html xmlns:toto="http://www.w3.org/1999/xhtml"/>

sont trois nœuds "identiques".

Tiens. Et si plutôt que d'ajouter un attribut Version on avait changé le namespace:

<html xmlns="http://www.w3.org/1999/xhtml">
 <head>
  <title>Mon site, page d'accueil</title>
 </head>
 <body>
  <h1>Bonjour</h1>
 </body>
</html>

puis, pour la nouvelle version:

<html xmlns="http://www.w3.org/2005/xhtml">
 <head>
  <title>Mon site, page d'accueil</title>
 </head>
 <body>
  <h1>Bonjour</h1>
 </body>
</html>

Et bien, ça aurait cassé toutes ces belles technologies manipulant l'XML, XPath, XSL, etc. En effet, dans la requête XPath //html:title (qui retournerait la balise <title> du document), le html:, il ne sort pas de nulle part, il a été associé à une URI. Et cette URI, elle a tout intérêt à être la même que celle utilisée dans le document, sinon rien ne sera trouvé.

Alors ? Article sans queue ni tête ? Petit effort de conclusion:

Un attribut Version, c'est le bon plan quand la structure du document change peu, genre ajout de quelques nouvelles balises, attributs, etc. L'ancien outil ne tirera pas parti de ces nouveautés mais continuera à fonctionner.

Un changement de namespace, c'est le bon plan quand seul le nom du standard est resté, que derrière tout a changé, que l'ancien outil ferait une erreur s'il considérait le nouveau document comme étant d'un type connu.

Ah oui. Que font les specs Liberty Alliance ? Les deux.