2017-05-15 7 views
0

Ich versuche eine XML-Datei in ein C# -Objekt zu lesen. Das XML enthält mehrere untergeordnete Elemente. Mit dem Code unten Ich kann alle Zugriff auf die Top-Felder (Version, Live, pageid, etc.) ohne Probleme jedoch, wenn ich versuche, einen untergeordneten Knoten Wert zuzugreifen, erhalte ich einC# XML in Objekt mit untergeordneten Elementen parsen

Object reference not set to an instance of an object. 

, die ich davon ausgehen, Angeben, dass XMLSerializer die Knoten mit meinem Objekt nicht zuordnen kann. Ich habe verschiedene Objekttypen wie ein Listenfeld über ein Array ausprobiert, aber es scheint immer noch die gleichen Ergebnisse zu erzielen. Daher bin ich mir nicht sicher, was der beste Weg ist, um das zu erreichen.

Jede Hilfe, die meine in die richtige Richtung zeigt, würde sehr geschätzt werden.

XML

<?xml version="1.0" encoding="utf-8"?> 
    <LiveModelStruct xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <version>1</version> 
    <live>true</live> 
    <pageid>1</pageid> 
    <data>test data</data> 
    <giveawayactive>false</giveawayactive> 
    <giveawayserial>00000000</giveawayserial> 
    <templates> 
    <template> 
     <id>1</id> 
     <title>Template 1</title> 
     <type>Opener</type> 
    </template> 
    <template> 
     <id>2</id> 
     <title>Template 2</title> 
     <type>Song</type> 
    </template> 
    </templates> 
</LiveModelStruct> 

Objekt

[XmlRoot(ElementName = "LiveModelStruct")] 
public class LiveModelStruct 
{ 
    [XmlElement(ElementName = "version")] 
    public string version { get; set; } 
    [XmlElement(ElementName = "live")] 
    public string live { get; set; } 
    [XmlElement(ElementName = "pageid")] 
    public string pageid { get; set; } 
    [XmlElement(ElementName = "data")] 
    public string data { get; set; } 
    [XmlElement(ElementName = "giveawayactive")] 
    public string giveawayactive { get; set; } 
    [XmlElement(ElementName = "giveawayserial")] 
    public string giveawayserial { get; set; } 
    [XmlElement(ElementName = "templates")] 
    public Templates Templates { get; set; } 
    [XmlAttribute(AttributeName = "xsi", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string Xsi { get; set; } 
    [XmlAttribute(AttributeName = "xsd", Namespace = "http://www.w3.org/2000/xmlns/")] 
    public string Xsd { get; set; } 
} 

[XmlRoot(ElementName = "templates")] 
public class Templates 
{ 
    [XmlElement(ElementName = "template")] 
    public Template[] Template { get; set; }  
} 

[XmlRoot(ElementName = "template")] 
public class Template 
{ 
    [XmlElement(ElementName = "id")] 
    public string id { get; set; } 
    [XmlElement(ElementName = "title")] 
    public string title { get; set; } 
    [XmlElement(ElementName = "type")] 
    public string type { get; set; } 
} 

-Code

... 
var serializer = new XmlSerializer(typeof(LiveModelStruct)); 
var data = (LiveModelStruct)serializer.Deserialize(stream); 
var test1 = data.version; 
Debug.WriteLine(test1); //Returns 1 as it should 

var test = data.Templates.Template[0].title; //Throws Error 
Debug.WriteLine(test); 
+0

Verwenden LINQ to XML – Jack

+0

Ich kann nichts falsch mit dem Code. Ich klebte alles in LinqPad und lief es und es gibt mir 1 und Vorlage 1, keine Ausnahme. –

+0

Ich habe hier eine Dotnetfiddle gemacht: https: //dotnetfiddle.net/kDv4nF und es funktioniert auch. –

Antwort

0

Verwenden LINQ to XML XML-zu analysieren.

Parse xml using LINQ to XML to class objects

XDocument doc = XDocument.Parse(xml); 
var result = from c in doc.Descendants("LiveModelStruct") 
      select new LiveModelStruct() 
      { 
        version = (string)c.Element("version").Value, 
        live = (string)c.Element("live").Value 
      }; 
+1

Ich versuche, dies zu implementieren, aber einen Syntaxfehler mit der folgenden Angabe: ** Konnte eine Implementierung des Abfrage-Patterns nicht finden für Quellentyp 'XDocument'. 'Select' nicht gefunden. ** Ich habe Referenzen zu System.Linq und System.Xml.Linq hinzugefügt. – logicallysynced

+0

Okay, ich habe das obige Problem mit ** doc.Descendants ("LiveModelStruct") behoben ** – logicallysynced

+0

@logicallysynced Wenn dein Problem gelöst ist, markiere es als gelöst, wenn du kannst. – Jack