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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : 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
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 :
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.