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);
Verwenden LINQ to XML – Jack
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. –
Ich habe hier eine Dotnetfiddle gemacht: https: //dotnetfiddle.net/kDv4nF und es funktioniert auch. –