問題の説明:
私はDataGridを持っています。Listによって入力されています。そのためのコードは次のとおりです。
List<SomeClass> someClassList = new List<SomeClass>();
//Fill somClassList with data (omited for brevity)
myDataGrid.ItemsSource = someClassList;
これは機能し、すべての値が正しく表示されます。ユーザーはすべてのセルを編集して、新しい行を作成できます。ユーザーがいくつかのボタンをクリックした後、そのDataGrid内の値を次の構造のXMLファイルに保存します。
<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 ファイルに書き込む必要があります。残念ながら、これは簡単な作業ではないようです。出現回数が可変の内部タグが 2 つあるからです。
これまでに得たのは次のコードです。これは、わかりやすくするために追加したサンプル DataGridから同様に追加されたXML ファイルを生成します。
//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>
そして、ここに例があります-ユーザーがボタンをクリックした後にXMLファイルが作成されるDataGrid :
コードは可変数の「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 ファイルに保存するよりスマートな方法はありますか?