ゲームエフェクトデザイナーのブログ | A Real-Time VFX Artist's Blog

About Making Materials on UE, Making Tools with C#, etc

C# XMLへの階層構造の保存メモ2(TreeView編)

前回に続き、今回はTreeViewのラベル名をXMLへ書き出してみます。

こちらに再帰処理で全てのノード名を取得するサンプルが記載されています。

こちらを参考に少しずつ進めてみました。

まずはフォームを用意してあらかじめTreeViewにノードを登録しておきました。

f:id:moko_03_25:20190609185007j:plain

ボタンクリックイベントでルートノードのラベル名をXMLで書き出してみました。
例によって「using System.Xml.Linq;」を先頭に追加するのをお忘れなく。。

private void Form1_Load(object sender, EventArgs e)
{
	// ツリーを全て展開
	treeView1.ExpandAll();
}

private void Button1_Click(object sender, EventArgs e)
{
	XmlSave();
}

public void XmlSave()
{
	// XMLの内容の定義
	var xml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));

	// 構造ごとの要素を定義
	XElement 学校;
	XElement クラス;
	XElement 生徒;

	// <私立ほにゃ高校>タグを作成してxmlに追加
	学校 = new XElement("私立ほにゃ高校");
	xml.Add(学校);

	// TreeViewのノード情報をnodesコレクションに格納
	TreeNodeCollection nodes = treeView1.Nodes;

	// ルートノードに対するループ処理
	foreach (TreeNode node in nodes)
	{
		// < クラス > タグを作成してRoot(つまり学校)に追加
		クラス = new XElement(node.Text);
		xml.Root.Add(クラス);
	}

	// TextBox1に表示
	textBox1.Text = xml.Declaration.ToString();
	textBox1.Text = xml.ToString();
}

うまくいきました。

f:id:moko_03_25:20190609184916j:plain

次にルートノードのひとつ下の階層を<生徒>タグ、そしてさらにその下に<名前>タグの入れ子にしてXMLに書き出してみました。

public void XmlSave()
{
	// XMLの内容の定義
	var xml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));

	// 構造ごとの要素を定義
	XElement 学校;
	XElement クラス;
	XElement 生徒;

	// <私立ほにゃ高校>タグを作成してxmlに追加
	学校 = new XElement("私立ほにゃ高校");
	xml.Add(学校);

	// TreeViewのノード情報をnodesコレクションに格納
	TreeNodeCollection nodes = treeView1.Nodes;

	// ルートノードに対するループ処理
	foreach (TreeNode node1 in nodes)
	{
		// < クラス > タグを作成してRoot(つまり学校)に追加
		クラス = new XElement(node1.Text);
		xml.Root.Add(クラス);

		// 子ノードに対するループ処理
		foreach (TreeNode node2 in node1.Nodes)
		{
			// <生徒>タグを作成して名前をぶら下げてから<クラス>タグに追加
			生徒 = new XElement("生徒");
			生徒.Add(new XElement("名前", node2.Text));
			クラス.Add(生徒);
		}
	}

	// TextBox1に表示
	textBox1.Text = xml.Declaration.ToString();
	textBox1.Text = xml.ToString();
}

うまくいきました。

f:id:moko_03_25:20190609190953j:plain

いよいよ本番である再帰処理は次の記事にまとめました。