Bon, ce soir, je comprenais pas pourquoi j'avais des éléments non qualifiés dans mes messages SOAP :
<?xml version="1.0" standalone="no"?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <ns2:sayHello xmlns:ns2="http://hello/"> <arg0>Juju</arg0> </ns2:sayHello> </S:Body> </S:Envelope>
Alors que dans mon WSDL, j'avais un truc comme ça :
<xs:schema targetNamespace='http://hello/' version='1.0' xmlns:tns='http://hello/' xmlns:xs='http://www.w3.org/2001/XMLSchema'> <xs:element name='sayHello' type='tns:sayHello'/> <xs:complexType name='sayHello'> <xs:sequence> <xs:element minOccurs='0' name='arg0' type='xs:string'/> </xs:sequence> </xs:complexType> </xs:schema>
Mon arg0 aurait du être dans mon tarnetNamespace !
Alors, j'ai été lire la spécification XML Schema. Je dois dire que c'est un peu douloureux, mais j'ai tout de même trouvé la réponse !
Elle est très bien expliquée sur ce billet de blog, mais, rapidement, la raison vient de l'attribut optionnel elementFormDefault. En effet, cet attribut de schema vaut, par défaut, unqualified. Cela signifie que les éléments définis de manière imbriquée sont définis dans le namespace par défaut !
Alternativement, si l'attribut elementFormDefault avait été spécifié avec une valeur de qualified, alors arg0 aurait bien été dans le namespace http://hello/ !
Parfois, le XML, ça me fatigue....

2 réactions
1 De kiki - 27/03/2009, 08:51
Je me permet de généraliser sauvagement et de pauser la question suivante :
XML or not XML ?
Et si ce qui comptait finalement c'était la lisbilité et l'interopérabilité ?
Pour etre vraiment interopérable, un système ne doit il pas dire ce qu'il fait et faire ce qu'il dit ? Alors excusez moi mais si pour lire ce qu'il fait il faut d'abord connaitre les arcannes du langage le plus froid et rigoriste du monde ...
kiki
philosophe de comptoir
2 De Fabrice - 30/03/2009, 11:16
s/elementFormQualified/elementFormDefault
Et ton problème, ce n'est pas XML, c'est XML Schema. Mais quand on fait du SOAP on cherche les problèmes...