2016-04-27 10 views
0

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 Parameter targetTest fehlt, der die Sample Konstruktor braucht, aber was ist, wenn ich nicht Wissen, was fehlt? Auch weiß ich, dass ReferenceCount für Klasse Verification 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 
} 
+0

@ 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 –

+0

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

Antwort

1

Ihre Code Kind-Elemente von DesiredTargets zu lesen versucht h.Element("name").Value verwenden. Wenn ein Element nicht vorhanden ist, gibt Elementnull zurück und der Aufruf an die Value-Eigenschaft wird NullReferenceException werfen.

Keines der 7 Elemente, die Sie zu lesen versuchen, existiert tatsächlich, also werden alle diese das Problem verursachen, das Sie sehen. Sie sind nicht Elemente, sie sind Attribute des Elements Sample. Als beiseite, sind dort eingebaute in explizite Konvertierungen in LINQ to XML, die Sie bedeuten nicht, die Fäden analysieren müssen:

Also, so etwas wie dies tatsächlich funktionieren würde:

doc.Descendants("DesiredTargets") 
    .Elements("Sample") 
    .Select(x => new Sample(
     null, 
     (double)x.Attribute("X1"), 
     (double)x.Attribute("X2"), 
     (double)x.Attribute("Y1"), 
     (double)x.Attribute("Y2"), 
     (double)x.Attribute("A"), 
     (double)x.Attribute("B"), 
     (double)x.Attribute("C"), 
     (int)x.Attribute("ReferenceNumber")) 
    ).ToList(); 

Das heißt, Sie wären viel besser dran mit XmlSerializer als Hand Codierung der Serialisierung selbst. List<T> sollte kein Problem sein.

+0

Arbeitete für die Liste. Vielen Dank! Ich habe jetzt ein anderes Problem, in Bezug auf die Restvariable 'Verification' Klasse könntest du mir helfen? –

Verwandte Themen