2017-10-09 17 views
0

Je dois tester mon application qui envoie xml via une requête http. Alors je me l'envoie et j'essaie de le désertifier. Je reçois "Il y a une erreur dans le document XML (1, 2).". Je peux créer XmlDocument avec une chaîne xml reçue, donc xml est correct. Je pense avoir l'exception car j'ai créé un schéma à partir d'une source différente, c'est-à-dire que j'ai copypassé mes classes pour xml dans une autre application, créé un schéma en utilisant cette application, puis j'ai créé des classes à partir de ce schéma. Maintenant, j'ai créé un serveur simple qui reçoit xml via http et essaye de le désérialiser et copié les classes générées là. Voici le code:C# Erreur lors de la désérialisation de xml à l'objet

static void Main(string[] args) 
     { 
      HttpListener listener = new HttpListener(); 
      listener.Prefixes.Add(@"http://127.0.0.1:123/ololo/"); 
      listener.Start(); 
      var context = listener.GetContext(); 
      var xmlstring = string.Empty; 

      using (var sr = new StreamReader(context.Request.InputStream)) 
      { 
       xmlstring = sr.ReadToEnd(); 
      } 
      XmlDocument xmlka = new XmlDocument(); 
      xmlka.LoadXml(xmlstring); 
      XmlSerializer serializer = new XmlSerializer(typeof(XmlData)); 
      MemoryStream memStream = new MemoryStream(Encoding.UTF8.GetBytes(xmlstring)); 
      try 
      { 
       XmlData resultingMessage = (XmlData)serializer.Deserialize(memStream); 
      } 
      catch(Exception ex) 
      { 

      } 
     } 

Trace de la pile:

at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events) 
    at System.Xml.Serialization.XmlSerializer.Deserialize(Stream stream) 
    at ConsoleApplication1.Program.Main(String[] args) in c:\\users\\jamil\\documents\\visual studio 2015\\Projects\\ConsoleApplication1\\ConsoleApplication1\\Program.cs:line 45 

message InnerException:

<XmlData xmlns='http://schemas.datacontract.org/2004/07/Common.Util'> was not expected. 

Tous les index de classes générées ressemblent à ceci:

// <auto-generated> 
    //  This code was generated by a tool. 
    //  Runtime Version:4.0.30319.42000 
    // 
    //  Changes to this file may cause incorrect behavior and will be lost if 
    //  the code is regenerated. 
    // </auto-generated> 
    //------------------------------------------------------------------------------ 

    // 
    // This source code was auto-generated by xsd, Version=4.6.1055.0. 
    // 


    /// <remarks/> 
    [System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")] 
    [System.SerializableAttribute()] 
    [System.Diagnostics.DebuggerStepThroughAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = true)] 

Ce qui me embrouille à ce sujet est Namespace = « »

+2

Collez votre fichier XML. – Aybe

+0

Qu'a-t-il à la ligne 45 de 'program.cs'? –

+0

@Ivan, XmlData resultMessage = (XmlData) serializer.Deserialize (memStream); – Jamil

Répondre

1

Vous pouvez essayer d'ajouter l'espace de noms à votre classe racine XmlData:

[XmlRoot(ElementName = "XmlData", Namespace = "http://schemas.datacontract.org/2004/07/Common.Util")] 
+0

Merci, cela a fonctionné. Mais comment puis-je inclure l'espace de noms dans le fichier .xsd? – Jamil

+0

Si vous avez un fichier xml avec un espace de noms, vous pouvez utiliser: 'xsd xmldata.xml' pour créer le fichier' .xsd' – PinBack

+0

Non, j'ai suivi le guide et créé le fichier .dll avec les classes, puis j'ai lancé xsd myfile.dll, puis xsd schema0.xsd/classes – Jamil