2010-07-21 47 views
1

目標是從XML填充數據集,排序其中一個DataTable,然後將排序的DataSet寫回XML。在讀取和寫入XML之間對DataSet進行排序

我似乎無法排序我的數據集,並嘗試了一些變化。它增加了數據,但沒有排序。希望有人能幫助阻止我拉我的頭髮。

DataSet dsXml = new DataSet(); 
dsXml.ReadXml(msXml); 
DataTable tbl; 
// Read DataTable. 
tbl = dsXml.Tables["cj"]; 
// Set Primary Key 
tbl.PrimaryKey = new DataColumn[] { tbl.Columns["a"] }; 
DataView dtView = tbl.DefaultView; 
DataRow foundRow = tbl.Rows.Find(findCookiejarId); 
tbl.Rows.Add(addRow); 
dtView.ToTable().Sort = "a ASC"; 
StringWriter sw = new StringWriter(); 
dsXml.WriteXml(sw); 

UPDATE

現在它會從數據集中的其他表。這是XML應該如何看:

<user_data> 
    <settings> 
    <a></a> 
    <b></b> 
    <c></c> 
    </settings> 
    <perms> 
    <a></a> 
    <b></b> 
    <c></c> 
    </perms> 
    <cj> 
    <a></a> 
    <b></b> 
    <c></c> 
    </cj> 
    <cj> 
    <a></a> 
    <b></b> 
    <c></c> 
    </cj> 
    <cj> 
    <a></a> 
    <b></b> 
    <c></c> 
    </cj> 
</user_data> 

而且它看起來像這樣,除去其他表,但那種工作得很好:)

</DocumentElement> 
    <cj> 
    <a></a> 
    <b></b> 
    <c></c> 
    </cj> 
    <cj> 
    <a></a> 
    <b></b> 
    <c></c> 
    </cj> 
    <cj> 
    <a></a> 
    <b></b> 
    <c></c> 
    </cj> 
</DocumentElement> 

我如何使用C#來排序只是數據表cj,然後將整個DataSet寫回XML? settingsperms應保持不變。

回答

3

一體,實現你的目標的方法是:

  • 負荷排序CJ實體到一個新的DataTable
  • 從原始數據集
  • 除去未排序與新重新填充的DataSet一組分選的CJ

Here's the proof-of-concept for sorting on pastebin。 我用this XML with the proof。該output is shown sorted as you'd expect

DataSet ds = new DataSet(); 
ds.ReadXml(@"D:\foo.xml"); 
DataTable tbl = ds.Tables["cj"]; 
tbl.PrimaryKey = new DataColumn[] { tbl.Columns["a"] }; 
DataView view = tbl.DefaultView; 
view.Sort = "a ASC"; 
DataTable sortedBy_a = view.ToTable(); 

//remove all the CJ tables -- they're currently unsorted 
ds.Tables.Remove("cj"); 

//add in all the sorted CJ tables 
ds.Tables.Add(sortedBy_a); 

StringWriter sw = new StringWriter(); 
ds.WriteXml(sw); 
+0

非常感謝先生,只是這份工作! – arbme 2010-07-22 17:06:46

0

您創建的DataView反映了排序結果,而不是基礎數據集。

2

您已成功將該排序應用於DataView。使用DataView的.ToTable()方法,然後使用表的.WriteXML()方法輸出到文件。

dtView.ToTable().WriteXml(sw); 
+0

感謝它擊中了現場!正在玩它一個小時左右:) – arbme 2010-07-21 23:33:56

+0

你知道它爲什麼要用替換xml中的根節點嗎?它應該是? – arbme 2010-07-21 23:37:53

+0

@arbme:常見的建議是將從ToTable()返回的DataTable添加到一個全新的DataSet中。從那裏,命名DataSet,並且'DocumentElement'將被更改爲DataSet的名稱。然後調用'WriteXml',也許它會按照你的預期成形。 – 2010-07-22 00:06:53