[SOAP] Désérialisation et Namespace
Bonjour,
Je développe une application qui interroge un Web Service sur lequel je n'ai pas la main et pour lequel on m'a fourni un WDSL. Le Service me retourne un message SOAP à partir duquel je dois extraire un fragment et désérialiser un objet dont le type est dans le WSDL.
Ce fragment XML fait référence à des préfixes de NameSpace (Ici, le préfixe est "n"):
Code:
1 2 3 4 5 6 7 8 9 10
|
<soapenv:Body>
<GetData xmlns:n="http://blabla.com">
<BlaBlaType xsi:type="n:BlaBlaType">
<n:Detail>
<n:Status>0</n:Status>
</n:Detail>
</BlaBlaType >
</GetData>
</soapenv:Body> |
La récupération du flux SOAP retour est OK.
A partir de ce flux, j'utilise le code suivant pour désérialiser (:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
Dim l_Value As String
Dim l_XmlDoc As New XmlDocument
Dim l_XmlNode As XmlNode
Dim l_NsMgr = New XmlNamespaceManager(l_XmlDoc.NameTable)
' chargement des données retour dans un document Xml
l_XmlDoc.LoadXml(l_Value)
' gestion des namespaces
l_nsmgr = New XmlNamespaceManager(l_XmlDoc.NameTable)
l_nsmgr.AddNamespace("soapenv", "http://schemas.xmlsoap.org/soap/envelope/")
l_nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance")
l_nsmgr.AddNamespace("n", "http://blabla.com")
' sélection du noeud
l_XmlNode = l_XmlDoc.SelectSingleNode("soapenv:Envelope/soapenv:Body/GetData", l_nsmgr)
l_Value = l_XmlNode.InnerXml
' création d'un flux mémoire et d'un lecteur à partir de la chaîne XML
Dim bytes() As Byte
ReDim bytes(value.Length)
System.Text.Encoding.UTF8.GetBytes(l_Value, 0, l_Value.Length, bytes, 0)
Dim l_stream As New MemoryStream(bytes)
' mapping des types
Dim l_SoapReflector As New SoapReflectionImporter()
Dim l_TypeMapping As XmlTypeMapping = l_SoapReflector.ImportTypeMapping(GetType(BlaBlaType))
' désérialisation
Dim l_XmlSerializer As New XmlSerializer(l_TypeMapping)
Dim l_obj = l_XmlSerializer.Deserialize(l_XmlReader)
l_TypedObject = CType(l_obj, BlaBlaType) |
Quand l'instruction soulignée est exécutée, je catch une exception dont le message est :
Citation:
Le préfixe de l'espace de noms 'n' n'est pas défini.
Ma question est la suivante : comment se fait-il que le préfixe de l'espace de nom "http://blabla.com"ne soit pas connu alors que je l'ai ajouté au NamespaceManager ?
Merci.