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...