2016-06-21 7 views
0

ich XML-Daten aus einer Datei in eine Liste von Objekten dieser Klasse analysieren:Lesen von XML richtig, wird aber um verwirrte später

public class VerificationSample 
{ 
    public double DesiredA { get; set; } 
    public double DesiredB { get; set; } 
    public double DesiredC { get; set; } 

    // .. 

    public void ReadXml(XmlReader reader) 
    { 
     reader.ReadToFollowing("VerificationSample"); 

     this.DesiredA = (double)FileStructure.GetAttributeSafe(reader, "DesiredA", typeof(double)); 
     this.DesiredB = (double)FileStructure.GetAttributeSafe(reader, "DesiredB", typeof(double)); 
     this.DesiredC = (double)FileStructure.GetAttributeSafe(reader, "DesiredC", typeof(double)); 
     this.ReferenceNumber = (int)FileStructure.GetAttributeSafe(reader, "ReferenceNumber", typeof(int)); 
     // .. 
    } 
} 

ich diese Probe xml lesen:

<VerificationSamples Count="4"> 
    <VerificationSample DesiredA="0.000" DesiredB="50.000" DesiredC="0.000" ReferenceNumber="0"/> 
    <VerificationSample DesiredA="75.000" DesiredB="-3.000" DesiredC="0.000" ReferenceNumber="0"/> 
    <VerificationSample DesiredA="-30.000" DesiredB="0.000" DesiredC="0.000" ReferenceNumber="1"/> 
    <VerificationSample DesiredA="-2.000" DesiredB="-60.000" DesiredC="0.200" ReferenceNumber="1"/> 
    </VerificationSamples> 

Mit diesem routine:

public void LoadFromFile(string path) 
{ 
    XmlReader reader = XmlReader.Create(path); 

    // .. 

    reader.ReadToFollowing("VerificationSamples"); 
    int count = (int)FileStructure.GetAttributeSafe(reader, "Count", typeof(int)); 
    this.VerificationSamples.Clear(); 

    for (int i = 0; i < count; i++) 
    { 
     VerificationSample newVerificationSample = new VerificationSample(); 
     newVerificationSample.ReadXml(reader); 
     this.VerificationSamples.Add(newVerificationSample); 
    } 
} 

Alles ist gut so weit und funktioniert wie ein Charme. Später, wenn ich eine andere Funktion ausführe, wo ich versuche, auf meine VerificationSamples Liste zuzugreifen, um einige Werte meiner Objekte zu verwenden, wird die Reihenfolge der Objekte durcheinander gebracht. So erste Zeile in der XML (war das erste Objekt), aber später ist es die 3. .. 2. ist der 1. .. 4. ist der 2. usw. (kein offensichtliches Muster). Kann sich jemand vorstellen warum ???

+0

Es ist, weil es nur ist willkürlich die Objekte aus der Liste Grabbing - Sie müssen '.OrderBy (x => x.SomeValue)' verwenden, um sie in einer bestimmten Reihenfolge –

+0

zurückzukehren @Geoff Es ist nie zufällig die XML-Zeilen gepackt . Es beginnt immer mit der ersten Zeile -> Objekt hinzufügen, zweite Zeile -> Objekt hinzufügen ... usw. Ich habe es viele Male beobachtet. Was würden Sie als Lösung für Ihr Argument vorschlagen, wenn dies der Fall ist? –

+0

Sie haben Recht - es wird die XML-Zeilen der Reihe nach erfassen - aber wenn Sie die Liste erneut aus dem Speicher herausholen/greifen, muss die speicherinterne "Liste" ('VerificationSamples'?) Nach einem Wert sortiert werden; ansonsten erscheint die Reihenfolge "zufällig" –

Antwort

1

Dies geschah aufgrund eines Problems bei der erneuten Bereitstellung von Daten aus der Datenbank. Es wurde nun behoben, indem eine Eigenschaft in dem XML-OrderID hinzufügen, die für den Auftrag als Referenz verwendet werden:

<VerificationSamples Count="4"> 
    <VerificationSample DesiredA="0.000" DesiredB="50.000" DesiredC="0.000" ReferenceNumber="0" OrderID="1"/> 
    <VerificationSample DesiredA="75.000" DesiredB="-3.000" DesiredC="0.000" ReferenceNumber="0" OrderID="2"/> 
    <VerificationSample DesiredA="-30.000" DesiredB="0.000" DesiredC="0.000" ReferenceNumber="1" OrderID="3"/> 
    <VerificationSample DesiredA="-2.000" DesiredB="-60.000" DesiredC="0.200" ReferenceNumber="1" OrderID="4"/> 
    </VerificationSamples> 

Immer wenn ich die Liste aus der Datenbank abrufen, ich habe gerade sortieren sie durch die OrderID. VerificationSamples.OrderBy(x => x.OrderID);

1

Wenn die Datei nicht groß ist, verwenden Sie XElement.

using System.Xml.Linq 
XElement file=XElement.Load(@"your path"); 
foreach(var VerificationSample in file.Elements("VerificationSample")) 
{ 
    // do want you want XElement type VerificationSample in order at the file 
} 
+0

Danke Mehmet für den Vorschlag. Aber XmlReader ist überall im Code und das Ändern ist jetzt ein zeitaufwändiger Prozess. –

1

Per this answer, List<T> garantiert sowohl die Reihenfolge des Einführens und die Reihenfolge des Abrufs.

Wenn die Elemente nicht in der Reihenfolge ausgegeben werden, in der sie hinzugefügt wurden, gibt es eine externe Kraft, die die Reihenfolge stört (möglicherweise sortiert).

+0

Mike Ich verbrachte Zeit Debuggen genau diesen Fall. Ich suchte irgendwo nach einer Sort/Orderby-Funktion und konnte keine finden. Ich denke, dass die Datenbank die Daten auf eine beliebige Art und Weise abruft (Bug). Das Problem wurde vorerst behoben, indem eine OrderID in der XML-Datei hart codiert und als OrderReference beibehalten wurde –