2017-06-14 1 views
0

Donc après que je reçois ma réponse que je fais (Où T dans ce cas est string):Comment désérialiser une réponse de savon qui n'est qu'un élément?

var theResult = response.Content.ReadAsStringAsync().Result; 
using (var stringreader = new StringReader(theResult)) 
{ 
    var serializer = new XmlSerializer(typeof(T)); 
    var responseObj = (T)serializer.Deserialize(stringreader); 
} 

theResult est:

<string xmlns="http://tempuri.org/">Hello World</string> 

Quand je fais Desrialize je reçois une exception. <string xmlns='http://tempuri.org/'> was not expected. comme exception interne et There is an error in XML document (2, 2). comme message.

Je suis en train de désérialiser Hello World en une chaîne ou de désérialiser en un objet lorsque j'ai plusieurs éléments avec plus qu'un simple élément racine. Quand il y a un élément racine avec plus de membres, je pense que j'ai compris.

+0

Vous devez supprimer l'espace de noms de l'enveloppe SOAP résultante. Si vous avez écrit le service, vous pouvez ajouter [WebService (Namespace = "")] je pense! – Wheels73

+0

Je ne l'ai pas écrit. – Pittfall

+0

Jetez un coup d'œil aux XmlSerializerNamespaces. Je pense que vous pouvez passer en un paramètre XML pour le sérialiseur et le supprimer. A défaut, vous devez avoir un type de référence lorsque vous avez ajouté le service Web. Recherchez le type de réponse qui contient la chaîne et vous pourrez peut-être l'y supprimer. – Wheels73

Répondre

1

Pour résoudre le problème, vous devez créer le sérialiseur avec l'espace de noms par défaut:

var serializer = new XmlSerializer(typeof(T), "http://tempuri.org/"); 
var responseObj = (T)serializer.Deserialize(stringreader); 


Vous pouvez lire encore quelques mots à ce sujet dans le lien ci-dessous:
https://msdn.microsoft.com/en-us/library/aa302290.aspx
Par exemple, si vous utilisez une classe custome, vous pouvez définir un nom de classe spécifique pour le XmlSerialier

[XmlRoot(Namespace="urn:my-namespace")] 
public class MyClass 
{ 
    public string MyField; 
} 

Vous pouvez en lire plus à ce sujet dans le lien ci-dessus.

+0

C'est génial. Le seul problème que je vois avec ceci est que je spécifie maintenant l'espace de noms dans le sérialiseur. Y a-t-il un moyen de retourner ceci dans un objet. C'est juste une chaîne donc je ne sais pas comment spécifier que mon élément racine est aussi mon membre. – Pittfall

+0

vous pouvez créer votre propre classe avec l'attribut XmlRoot comme je l'ai écrit ci-dessus [XmlRoot (Namespace = "urn: my-namespace")], de cette façon vous spécifiez la structure de la sérialisation. est-ce que vous voulez dire? Ou vous voulez désérialiser un objet avec une structure inconnue? –

0

Votre fichier XML n'est pas bien cadré car vous avez un tableau au niveau racine. Vous devez autoriser le lecteur xml à autoriser les fragments.

  XmlSerializer xs = new XmlSerializer(typeof(AppConfig)); 
      XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.ConformanceLevel = ConformanceLevel.Fragment; 
      XmlReader reader = XmlReader.Create(filepath); 
      AppConfig configData = (AppConfig)xs.Deserialize(reader);