Ich habe große Anzahl von XML-Dateien, die double
enthalten, int
, DateTime
, string
, lists of objects
.. usw. Mix von Variablentypen ähnlich wie diese:XML-Reader-Fehler: Der Objektverweis wurde nicht auf eine Instanz eines Objekts festgelegt
<?xml version="1.0" encoding="utf-8"?>
<Verification xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SerialNumber>1</SerialNumber>
<Description>V1 From File</Description>
<DateCreated>2016-04-22T09:27:54.193</DateCreated>
<DesiredX>1.000000</DesiredX>
<DesiredTargets count="3">
<Sample X1="535.108154296875" X2="1058.36315917969" Y1="780.292175292969" Y2="1037.53625488281" A="-44.5051406645421" B="-2.8002082198978" C="-0.211281331705749" DifferenceA="-44.5051406645421" DifferenceB="-2.8002082198978" DifferenceC="-0.211281331705749" ReferenceNumber="0" TimeTaken="Tuesday, April 26, 2016 2:25:43 PM" />
<Sample X1="529.666198730469" X2="533.695007324219" Y1="854.45654296875" Y2="514.573974609375" A="62.1131427426299" B="-4.93194374266585" C="-0.383094414887779" DifferenceA="62.1131427426299" DifferenceB="-4.93194374266585" DifferenceC="-0.383094414887779" ReferenceNumber="1" TimeTaken="Tuesday, April 26, 2016 2:25:43 PM" />
<Sample X1="172.242752075195" X2="777.789245605469" Y1="334.160064697266" Y2="740.525268554688" A="9.54891420214495" B="91.256891073657" C="0.329283687878274" DifferenceA="9.54891420214495" DifferenceB="91.256891073657" DifferenceC="0.329283687878274" ReferenceNumber="2" TimeTaken="Tuesday, April 26, 2016 2:25:45 PM" />
</DesiredTargets>
</Verification>
Die Liste der Objekte ist vom Typ Sample
, Standardkonstruktors:
public Sample(Test targetTest, double newX1, double newX2, double newY1, double newY2, double newA, double newB, double newC, int sampleNum)
Klasse Verification
die jede XML-Datei auf eine Instanz geladen werden davon:
public class Verification
{
public int SerialNumber { get; set; }
public int ReferenceCount { get; set; }
public string Description { get; set; }
public DateTime DateCreated {get; set; }
public double DesiredX { get; set; }
public List<Sample> DesiredTargets { get; set; }
// ..
// other variables and functions
}
Mission: laden die XML-Dateien
Zweck: Ich will nicht bestimmte Codemuster jeder Datei Struktur oder Tags ändern, wie hier Load in a simple list of objects vorgeschlagen passen
Vision-:
alle Variablen, die sollte nicht in der Xml existieren, wie
null
eingestellt werden (geschieht standardmäßig?) Hier weiß ich, dass der ParametertargetTest
fehlt, der dieSample
Konstruktor braucht, aber was ist, wenn ich nicht Wissen, was fehlt? Auch weiß ich, dassReferenceCount
für KlasseVerification
ist nicht in der XML .. usw.Ein Code, der die Dateien übereinstimmt und bearbeiten nicht alle Dateien einen Code
Mein Code übereinstimmen arbeitet mit XmlSerializer
wenn Ich hatte keine List<Sample>
. Jetzt hat die Datei ein List<Sample>
und der folgende Code verwendet XDocument
aber erscheint eine Fehlermeldung:
Object reference not set to an instance of an object
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
// ..
public void LoadFromFile(string path)
{
// stuff
// ..
// to load list of Sample
XDocument XmlReader = XDocument.Load(path);
// pops the error here
DesiredTargets =
XmlReader.Root.Elements("DesiredTargets")
.Select(h => new Sample(
null,
double.Parse(h.Element("X1").Value),
double.Parse(h.Element("X2").Value),
double.Parse(h.Element("Y1").Value),
double.Parse(h.Element("Y2").Value),
double.Parse(h.Element("A").Value),
double.Parse(h.Element("B").Value),
double.Parse(h.Element("C").Value),
int.Parse(h.Element("ReferenceNumber").Value)
))
.ToList();
// I don't have the code using XDocument for other variables yet but it works when there is no List<> using XmlSerializer
}
@ Mephy aber das passiert, bevor meine Anwendung geladen wird. Ich wusste das nicht, also werde ich es bearbeiten ** Edit **: Ich habe gerade festgestellt, dass ja kompiliert wird, aber dieser Code wird direkt beim Laden der Anwendung ausgeführt. Ich verwechselte das –
Auch eine gute Idee, nicht Pascal Gehäuse für Variablen zu verwenden, wie Sie für XmlReader tun, da sie von anderen Entwicklern oder sogar Ihnen oder dem Compiler leicht Regeln Typen verwechselt werden können. Es gibt beispielsweise eine XmlReader-Klasse in .NET Framework. – Heath