2017-08-11 4 views
0

J'ai une classe qui a la déclaration suivante:Est-ce possible d'avoir deux espaces de noms dans la classe XMLTypeAttribute pour gérer la désérialisation de 2 réponses soap?

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "http://schemas.xmlsoap.org/soap/envelope/")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "http://schemas.xmlsoap.org/soap/envelope/", IsNullable = false)] 

public partial class Envelope 
{ 
    private EnvelopeBody bodyField; 

    /// <remarks/> 
    public EnvelopeBody Body 
    { 
     get 
     { 
      return this.bodyField; 
     } 
     set 
     { 
      this.bodyField = value; 
     } 
    } 
} 

. 
. another code generated here based on response XML... 
. 

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "order")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "order", IsNullable = false)] 
public partial class insertResponse 
{ 

    private insertResponseOut outField; 

    /// <remarks/> 
    public insertResponseOut @out 
    { 
     get 
     { 
      return this.outField; 
     } 
     set 
     { 
      this.outField = value; 
     } 
    } 
} 

Lorsque la désérialisation réponse XML contenant <insertResponse xmlns="order">, je peux le faire avec succès que.

j'ai une autre XML réponse SOAP, qui est exactement du même format et je veux utiliser la même classe, mais avec les différents XmlTypeAttribute:

[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true, Namespace = "customer")] 
[System.Xml.Serialization.XmlRootAttribute(Namespace = "customer", IsNullable = false)] 
public partial class insertResponse 
{ 

    private insertResponseOut outField; 

    /// <remarks/> 
    public insertResponseOut @out 
    { 
     get 
     { 
      return this.outField; 
     } 
     set 
     { 
      this.outField = value; 
     } 
    } 
} 

Actuellement je manipuler une méthode désérialisation de réponse SOAP :

private Envelope DeserializeSoapResponse<T>(string soapResponse) 
{ 
    var serealizer = new XmlSerializer(typeof(T)); 
    Envelope result; 

    using (TextReader reader = new StringReader(soapResponse)) 
    { 
     result = (Envelope)serealizer.Deserialize(reader); 
    } 

    return result; 
} 

paramètre soapResponse n'est pas le chemin du XML, il est une chaîne représentant la réponse SOAP XML à partir du serveur.

moi aussi, essayé d'utiliser le lecteur XML personnalisé:

public class CustomXmlReader: System.Xml.XmlTextReader 
{ 
    public CustomXmlReader(string url) : base(url) { } 

    public override string NamespaceURI 
    { 
     get 
     { 
      if (base.NamespaceURI == "order") 
       return "customer"; 

      return base.NamespaceURI; 
     } 
    } 
} 

comme cela a été suggéré, mais je l'erreur suivante: illegal character in path, puisque, comme je l'attends, je dois envoyer l'URL à la réponse SOAP , mais l'envoi de la chaîne

Comment puis-je faire quelque chose comme ça? Est-ce possible de définir plusieurs espaces de noms pour XmlTypeAttribute ou XmlRootAttribute

Répondre

0

Pour ce faire, vous pouvez utiliser le lecteur xml personnalisé.

public class CustomXmlReader : XmlTextReader 
{ 
    // Define other required constructors 
    public CustomXmlReader(string url) : base(url) { } 
    public CustomXmlReader(TextReader reader) : base(reader) { } 

    public override string NamespaceURI 
    { 
     get 
     { 
      if (base.NamespaceURI == "order") 
       return "customer"; 

      return base.NamespaceURI; 
     } 
    } 
} 

Il convertit un espace de noms order à un espace de noms customer à la volée.

En conséquence, votre classe devrait avoir qu'une seule customer déclaration namespase:

[XmlType(AnonymousType = true, Namespace = "customer")] 
[XmlRoot(Namespace = "customer", IsNullable = false)] 
public partial class insertResponse 

Utilisation comme d'habitude:

string xml = "your xml here"; 

insertResponse response; 

using (var stringReader = new StringReader(xml)) 
using (var xmlReader = new CustomXmlReader(stringReader)) 
    response = (insertResponse)xs.Deserialize(xmlReader); 
+0

J'ai essayé d'utiliser cette approche, mais ont une exception en disant que 'caractère illégal en le chemin'. Je pense qu'il est provoqué par l'envoi de chaîne représentant la réponse XML SOAP au lieu du chemin lui-même. Mais cette logique fonctionne pour la désérialisation "d'ordre" – gene

+0

@gene - J'ai écrit: définir les autres [constructeurs] nécessaires (https://msdn.microsoft.com/fr-fr/library/system.xml.xmltextreader (v = vs. 110) .aspx # Anchor_2)! Voir mise à jour. –

+0

J'ai fait exactement ce que vous avez suggéré, mais j'ai toujours la même erreur – gene