2016-08-11 7 views
1

versucht, habe ich XML die, die wie folgt aussieht:SystemInvalidOperationException wenn deserialisiert XML in C#

<constituencyResults> 
    <constituencyResult seqNo="1"> 
    <consituencyId>2</consituencyId> 
    <constituencyName>Aberconwy</constituencyName> 
    <results> 
     <result> 
      <partyCode>LAB</partyCode> 
      <votes>8994</votes> 
      <share>33.00</share> 
     </result> 
     <result> 
      <partyCode>CON</partyCode> 
      <votes>7924</votes> 
      <share>29.10</share> 
     </result> 
    </results> 
    </constituencyResult> 
</constituencyResults> 

einen Link zu dem, was die ganze Datei aussieht ist here

Wenn ich Visual Studio verwenden einfügen als XML-Klassen erhalte ich die folgenden Klassen:

/// <remarks/> 
    [System.SerializableAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
    [System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)] 
    public partial class ConstituencyResults 
    { 

     private constituencyResultsConstituencyResult constituencyResultField; 

     /// <remarks/> 
     public constituencyResultsConstituencyResult constituencyResult 
     { 
      get 
      { 
       return this.constituencyResultField; 
      } 
      set 
      { 
       this.constituencyResultField = value; 
      } 
     } 
    } 

    /// <remarks/> 
    [System.SerializableAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
    public partial class constituencyResultsConstituencyResult 
    { 

     private byte consituencyIdField; 

     private string constituencyNameField; 

     private constituencyResultsConstituencyResultResult[] resultsField; 

     private byte seqNoField; 

     /// <remarks/> 
     public byte consituencyId 
     { 
      get 
      { 
       return this.consituencyIdField; 
      } 
      set 
      { 
       this.consituencyIdField = value; 
      } 
     } 

     /// <remarks/> 
     public string constituencyName 
     { 
      get 
      { 
       return this.constituencyNameField; 
      } 
      set 
      { 
       this.constituencyNameField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlArrayItemAttribute("result", IsNullable = false)] 
     public constituencyResultsConstituencyResultResult[] results 
     { 
      get 
      { 
       return this.resultsField; 
      } 
      set 
      { 
       this.resultsField = value; 
      } 
     } 

     /// <remarks/> 
     [System.Xml.Serialization.XmlAttributeAttribute()] 
     public byte seqNo 
     { 
      get 
      { 
       return this.seqNoField; 
      } 
      set 
      { 
       this.seqNoField = value; 
      } 
     } 
    } 

    /// <remarks/> 
    [System.SerializableAttribute()] 
    [System.ComponentModel.DesignerCategoryAttribute("code")] 
    [System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)] 
    public partial class constituencyResultsConstituencyResultResult 
    { 

     private string partyCodeField; 

     private ushort votesField; 

     private decimal shareField; 

     /// <remarks/> 
     public string partyCode 
     { 
      get 
      { 
       return this.partyCodeField; 
      } 
      set 
      { 
       this.partyCodeField = value; 
      } 
     } 

     /// <remarks/> 
     public ushort votes 
     { 
      get 
      { 
       return this.votesField; 
      } 
      set 
      { 
       this.votesField = value; 
      } 
     } 

     /// <remarks/> 
     public decimal share 
     { 
      get 
      { 
       return this.shareField; 
      } 
      set 
      { 
       this.shareField = value; 
      } 
     } 
    } 

Wenn ich versuche, sie deserialise ein XmlSerializer wie folgt aus: (ConstituencyResults) reader.Deserialize(file);

Ich bin eine Ausnahme immer

SystemInvalidOperationException Innerexception sagen: { "nicht zu erwarten war."}

Kann jemand helfen?

+0

Wieder habe ich es getestet und kein Problem. Verwenden Sie den richtigen Fall 'constituenceResults' und nicht' ConstituenceResults', wie Sie es tun. Benennen Sie die generierten Klassen um. – CodeNotFound

+0

@CodeNotFound, dass es gelöst hat, danke. Kannst du eine Antwort schreiben, die ich akzeptieren kann? – NRKirby

+0

Ich habe es nur als Antwort hinzugefügt. – CodeNotFound

Antwort

1

Sie haben dieses Problem, weil Sie Ihre Klassen nach der Generierung umbenannt haben.

Wenn Sie "XML als Klassen einfügen" Funktion verwendet haben, dann sollten alle generierten Klassen denselben Namen haben wie in der XML-Datei.

Da Sie die constituencyResults Klasse nach der Generierung in ConstituencyResults umbenannt haben, erhalten Sie diesen Fehler, den Sie in Ihrer Frage haben. Beachten Sie den Unterschied in c Brief.

Sie haben zwei Lösungen:

  • rückgängig machen Sie Ihre Änderungen mit ConstituencyResults zu Umbenennung, was die genration tat, bevor Sie Ihre Änderungen constituencyResults.
  • fügen Sie allen modifizierten Klassen, Eigenschaften usw. ein XmlElement-Attribut hinzu, indem Sie sie mit XmlElement z. XmlElement("constituencyResults") für ConstituencyResults.
+0

Danke für Ihre Hilfe! – NRKirby

+0

Gern geschehen. Vergessen Sie nicht, die erste Frage, die Sie vor dieser Frage gepostet haben, als Antwort zu markieren. – CodeNotFound

+0

Werde tun, wenn du mir eine Danksagung geben könntest wäre ich auch dankbar ... – NRKirby

1

Ich ändere Ihren Code ein wenig, um Ihren Fehler zu bekommen, aber von dem, was ich sehe, funktioniert es normal. Es gibt den Namen der XML-Datei als "XMLFile1.xml" im Ordner bin.

<?xml version="1.0" encoding="utf-8" ?> 
<ConstituencyResults> 
    <ConstituencyResult SeqNo="1"> 
     <ConsituencyId>2</ConsituencyId> 
     <ConstituencyName>Aberconwy</ConstituencyName> 
     <Results> 
     <Result> 
      <PartyCode>LAB</PartyCode> 
      <Votes>8994</Votes> 
      <Share>33.00</Share> 
     </Result> 
     <Result> 
      <PartyCode>CON</PartyCode> 
      <Votes>7924</Votes> 
      <Share>29.10</Share> 
     </Result> 
     </Results> 
    </ConstituencyResult> 
</ConstituencyResults> 

Dies ist die Klasse "ConstituenceResults.cs" wo alle Ihre Sachen. Ich habe den Namen der Variablen geändert, um sie lesbarer zu machen.

Das Programm "Program.cs", wo ich die Werte des Objekts drucken.

using System; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

namespace ConsoleApplication1 
{ 
    public class Program 
    { 
     static void Main(string[] args) 
     { 
     XmlSerializer oSerializer = new XmlSerializer(typeof(ConstituencyResults)); 
     FileStream oFileStream = new FileStream("XMLFile1.xml", FileMode.Open); 
     ConstituencyResults obj = (ConstituencyResults)oSerializer.Deserialize(oFileStream); 
     int iCnt = 0; 

     Console.WriteLine("Name : " + obj.ConstituencyResult.ConstituencyName); 
     Console.WriteLine("ID : " + obj.ConstituencyResult.ConsituencyId); 

     foreach (var v in obj.ConstituencyResult.Results) 
     { 
      iCnt++; 
      Console.WriteLine(""); 
      Console.WriteLine("Record #" + iCnt.ToString()); 
      Console.WriteLine(" PartyCode : " + v.PartyCode); 
      Console.WriteLine(" Share : " + v.Share); 
      Console.WriteLine(" Votes : " + v.Votes); 
     } 

     Console.ReadKey(); 
     } 
    } 
} 

Und das Ergebnis: Console result

In diesem Fall habe ich einen Filestream als 'Datei' Parameter.

+0

Hallo, willkommen zu stackoverflow. Indem Sie die Bilder als Teil Ihres Inhalts verwenden, können Sie eine klare Antwort geben. Danke –

Verwandte Themen