【问题标题】:sorting a DataSet between reading and writing to XML在读取和写入 XML 之间对 DataSet 进行排序
【发布时间】:2011-03-19 06:59:55
【问题描述】:

目标是从 XML 填充数据集,对其中一个 DataTables 进行排序,然后将排序后的 DataSet 写回 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);

更新

现在它从数据集中删除其他表。这就是 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# 仅对 DataTable cj 进行排序,然后将整个 DataSet 写回 XML? settingsperms 应该保持不变。

【问题讨论】:

    标签: c# ado.net dataset


    【解决方案1】:

    实现目标的一种方法是:

    • 将排序后的 CJ 实体加载到新的 DataTable 中
    • 从原始数据集中移除未排序的数据
    • 用新的排序 CJ 集重新填充 DataSet

    Here's the proof-of-concept for sorting on pastebin。 我用this XML with the proofoutput 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);
    

    【讨论】:

    • 非常感谢您,先生,就是这份工作!
    【解决方案2】:

    您已成功将排序应用到 DataView。使用DataView的.ToTable()方法,然后使用Table的.WriteXML()方法输出到文件。

    dtView.ToTable().WriteXml(sw);
    

    【讨论】:

    • 感谢它的到位!玩了一个小时左右:)
    • 你知道为什么当它应该是 时它会用 替换我在 xml 中的根节点吗?
    • @arbme:常见的建议是将ToTable()返回的DataTable添加到一个全新的DataSet。从那里命名 DataSet,DocumentElement 将更改为 DataSet 的名称。然后调用WriteXml,说不定它的造型就会如你所愿。
    【解决方案3】:

    您创建的 DataView 反映了排序结果,而不是基础数据集。

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2012-10-14
      • 2012-05-05
      • 1970-01-01
      相关资源
      最近更新 更多