Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在读取和写入XML之间对数据集进行排序_C#_Ado.net_Dataset - Fatal编程技术网

C# 在读取和写入XML之间对数据集进行排序

C# 在读取和写入XML之间对数据集进行排序,c#,ado.net,dataset,C#,Ado.net,Dataset,目标是从XML填充数据集,对其中一个数据表进行排序,然后将排序后的数据集写回XML 我似乎无法对数据集进行排序,并尝试了一些变体。它添加数据,但不进行排序。希望有人能帮我阻止我拔头发 DataSet dsXml = new DataSet(); dsXml.ReadXml(msXml); DataTable tbl; // Read DataTable. tbl = dsXml.Tables["cj"]; // Set Primary Key tbl.PrimaryKey = new DataC

目标是从XML填充数据集,对其中一个数据表进行排序,然后将排序后的数据集写回XML

我似乎无法对数据集进行排序,并尝试了一些变体。它添加数据,但不进行排序。希望有人能帮我阻止我拔头发

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>

看起来是这样的,删除了其他表,但排序工作正常:)



如何使用C#对DataTable
cj
进行排序,然后将整个数据集写回XML?
设置
perms
应保持不变。

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

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

您已成功地将排序应用于数据视图。使用DataView的
.ToTable()
方法,然后使用表的
.WriteXML()
方法输出到文件

dtView.ToTable().WriteXml(sw);

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

dtView.ToTable().WriteXml(sw);

实现目标的一种方法是:

  • 将已排序的CJ实体加载到新的数据表中
  • 从原始数据集中删除未排序的
  • 使用新的已排序CJ集重新填充数据集
。 我用过。这个


实现目标的一种方法是:

  • 将已排序的CJ实体加载到新的数据表中
  • 从原始数据集中删除未排序的
  • 使用新的已排序CJ集重新填充数据集
。 我用过。这个


谢谢,这很恰当!玩了一个小时左右:)你知道为什么它要用应该的时间替换xml中的根节点吗?@arbme:常见的建议是将从
ToTable()
返回的数据表添加到全新的
数据集
。从那里,命名数据集,
DocumentElement
将更改为数据集的名称。然后调用
WriteXml
,也许它会按照您的期望成形。谢谢,它正好击中了目标!玩了一个小时左右:)你知道为什么它要用应该的时间替换xml中的根节点吗?@arbme:常见的建议是将从
ToTable()
返回的数据表添加到全新的
数据集
。从那里,命名数据集,
DocumentElement
将更改为数据集的名称。然后调用
WriteXml
,也许它会像您期望的那样成形。非常感谢您,先生,就是这份工作!非常感谢你,先生,这就是工作!
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);