2016-06-21 16 views
0

我解析XML數據從文件導入到這個類的對象列表:讀取XML正確,但爲了得到更高混亂

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)); 
     // .. 
    } 
} 

我讀這個示例XML:

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

使用此例行程序:

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); 
    } 
} 

目前爲止所有的東西都很好,並且像魅力一樣。然而,後來當我執行另一個函數,嘗試訪問我的VerificationSamples列表以使用我的對象的某些值時,對象的順序變得混亂......因此xml中的第一行(是第一個對象),但後來它是第3個.. 2nd是1st .. 4th是2nd等(沒有明顯的模式)。有沒有人想象爲什麼?

+0

這是因爲它只是從列表中隨意獲取對象 - 您將需要使用'.OrderBy(x => x.SomeValue)'以特定順序返回它們 –

+0

@Geoff它從不隨機抓取xml行。它總是從第一行開始 - >添加對象,第二行 - >添加對象..等等。我多次觀看它。如果是這樣的話,你會如何解決你的觀點? –

+0

你是對的 - 它會依次獲取XML行 - 但是當你從內存中迭代/獲取列表時,內存中的「list」('VerificationSamples'?)將需要對一個值進行排序;否則訂單將顯得「隨機」 –

回答

1

這是由於從數據庫中提取數據時出現問題而發生的。它是固定的,現在通過在將被用作順序引用的XML OrderID添加一個屬性:

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

每當我從數據庫檢索列表,我只是有點它由訂單ID。 VerificationSamples.OrderBy(x => x.OrderID);

1

如果文件不大,請使用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

謝謝穆罕默德的建議。但是XmlReader在代碼中無處不在,現在這是一個耗時的過程。 –

1

this answerList<T>保證插入的順序和檢索的順序。

如果這些項目沒有按照它們的添加順序出現,那麼有一些外部力量會干擾這個順序(可能是排序)。

+0

Mike我花時間調試了這個案例。我正在尋找Sort/Orderby功能,但找不到任何功能。我認爲數據庫是以任意方式檢索數據(錯誤)。現在通過在xml中對OrderID進行硬編碼並將其保留爲我的OrderReference來解決此問題 –