【发布时间】:2013-10-30 08:50:32
【问题描述】:
问题描述:
我有一个 DataGrid。它由 List 填充。代码如下:
List<SomeClass> someClassList = new List<SomeClass>();
//Fill somClassList with data (omited for brevity)
myDataGrid.ItemsSource = someClassList;
这工作并且所有值都正确显示。用户现在可以编辑所有单元格并创建新行。用户单击某个按钮后,我想 save 将 DataGrid 内的 values 保存到 XML-File 的以下结构:
<Root>
<a>
<b>val1</b>
<c>val2</c>
<d>
<e>
<f>val3</f>
<g>val4</g>
<h>val5</h>
<i>val6</i>
</e>
<!--variable number of 'e'- tags with inner structure as above-->
</d>
</a>
<!--variable number of 'a'-tags with inner structure as above-->
</Root>
出于这个原因,我决定逐行遍历DataGrid会很聪明。因此,Button-Click-event-Handler 包含执行迭代的代码(每个值都由WriteLine()方法复制):
foreach (SomeClass someClassElement in myDataGrid.ItemsSource)
{
Trace.WriteLine(someClassElement.b+ ", " + someClassElement.c+ ", " +
someClassElement.f + ", " + someClassElement.g + ", " +
someClassElement.h + ", " + someClassElement.i);
}
我现在必须将每一行写入一个XML文件。不幸的是,这似乎不是一件容易的事,因为有两个出现次数可变的内部标签。
到目前为止,我得到的是以下 代码,它从我为其添加的 example DataGrid 生成同样附加的 XML-File清晰的目的。
//Button click code
XmlDocument doc = new XmlDocument();
XmlNode myRoot = doc.CreateElement("Root");
XmlNode a,b,c,d,e;
String last_b_value = "0";
foreach (SomeClass someClassElement in myDataGrid.ItemsSource)
{
String current_b_value = someClassElement.b;
if (last_b_value != current_b_value)
{
//Creating XML-elements and setting text
a = doc.CreateElement("a");
b = doc.CreateElement("b");
b.InnerText = someClassElement.b;
c = doc.CreateElement("c");
c.InnerText = someClassElement.c;
d = doc.CreateElement("d");
e = doc.CreateElement("e");
a.AppendChild(b);
a.AppendChild(c);
a.AppendChild(d);
d.AppendChild(e);
}
}
doc.AppendChild(myRoot);
// Save document
string filename = dlg.FileName;
doc.Save(@filename);
这是输出的 XML 文件:
<root>
<a>
<b>val_1_1</b>
<c>val_1_2</c>
<d>
<e />
<!-- the varying number of 'e'-tags is not created correctly -->
</d>
</a>
<a>
<b>val_2_1</b>
<c>val_2_2</c>
<d>
<e />
<!-- the varying number of 'e'-tags is not created correctly -->
</d>
</a>
<a>
<b>val_3_1</b>
<c>val_3_2</c>
<d>
<e />
<!-- the varying number of 'e'-tags is not created correctly -->
</d>
</a>
<!-- number of varying 'a'-tags is created correctly -->
</root>
下面是示例-DataGrid,用户单击按钮后,XML-File 将从该示例中创建:
代码确实能恰当地处理可变数量的'a'-标签,但缺少功能来编写每个“a”标签内有不同数量的“e”标签。
相反,输出 XML 文件应该看起来像:
<Root>
<a>
<b>val_1_1</b>
<c>val_1_2</c>
<d>
<e>
<f>x1</f>
<g>x1</g>
<h>x1</h>
<i>x1</i>
</e>
<e>
<f>x2</f>
<g>x2</g>
<h>x2</h>
<i>x2</i>
</e>
<e>
<f>x3</f>
<g>x3</g>
<h>x3</h>
<i>x3</i>
</e>
</d>
</a>
<a>
<b>val_2_1</b>
<c>val_2_2</c>
<d>
<e>
<f>x4</f>
<g>x4</g>
<h>x4</h>
<i>x4</i>
</e>
<e>
<f>x5</f>
<g>x5</g>
<h>x5</h>
<i>x5</i>
</e>
</d>
</a>
<a>
<b>val_3_1</b>
<c>val_3_2</c>
<d>
<e>
<f>x6</f>
<g>x6</g>
<h>x6</h>
<i>x6</i>
</e>
</d>
</a>
</Root>
问题:
- 如何调整代码以创建缺少的“e”标签?
- 是否有更智能的方法来读取 DataGrid 并将其值保存到相同的结构化 XML 文件中?
【问题讨论】:
-
使用 XMLSerializer 序列化您的对象。我强烈建议您避免尝试重新发明轮子。
-
关于您的问题 #2,Jon Skeet 的 C# In-Depth 对如何使用 Linq 编写 XML 有很好的描述。我昨晚刚在读。我现在不记得细节并且远离这本书 - 因此是评论而不是实际答案。
-
XMLSerializer 的问题是,'a'-tags 内的 'e'-tags 的可变长度也没有得到处理。
标签: c# xml wpf datagrid creation