C#でXMLファイルに親・子・孫‥といった階層構造を書き込みたい場合についてのメモです。
そもそもXMLを初めて扱うので基礎的なあたりを解説している記事を探して参考にしたのですが、こちらがとても入門として分かりやすくてオススメです。
という訳で試してみました。
Windowsフォームアプリでボタンをテキストボックスを配置。
中身はこちらのように記述。
自分でも理解しやすいように、学校>クラス>名前と住所‥という内容にしました。
「using System.Xml.Linq;」を先頭に追加するのをお忘れなく。。
private void Button1_Click(object sender, EventArgs e)
{
XmlSave();
}
public void XmlSave()
{
XDeclaration ヘッダー = new XDeclaration("1.0", "utf-8", "yes");
XDocument xml = new XDocument(ヘッダー);
XElement 学校;
学校 = new XElement("私立ほにゃ高校");
xml.Add(学校);
XElement クラス;
クラス = new XElement("一組");
クラス.Add(new XElement("名前", "石坂"));
クラス.Add(new XElement("住所", "静岡"));
xml.Root.Add(クラス);
クラス = new XElement("二組");
クラス.Add(new XElement("名前", "太郎"));
クラス.Add(new XElement("住所", "福岡"));
xml.Root.Add(クラス);
textBox1.Text = xml.Declaration.ToString();
textBox1.Text = xml.ToString();
}
実行してbutton1を押すとtextBox1にバッチリ表示されました!
ただし、実際にはもうちょっと複雑な構造‥例えばこんな感じにしたいですよね。
学校
クラス
先生
名前
生徒
名前
生徒
名前
クラス
先生
名前
生徒
名前
この場合はこちらのように記述すればOKです。
private void Button1_Click(object sender, EventArgs e)
{
XmlSave();
}
public void XmlSave()
{
var xml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
XElement 学校;
XElement クラス;
XElement 先生;
XElement 生徒;
学校 = new XElement("私立ほにゃ高校");
xml.Add(学校);
クラス = new XElement("クラス");
xml.Root.Add(クラス);
先生 = new XElement("先生");
先生.Add(new XElement("名前", "浅野先生"));
クラス.Add(先生);
生徒 = new XElement("生徒1");
生徒.Add(new XElement("名前", "飯尾"));
クラス.Add(生徒);
生徒 = new XElement("生徒2");
生徒.Add(new XElement("名前", "上田"));
クラス.Add(生徒);
クラス = new XElement("クラス");
xml.Root.Add(クラス);
先生 = new XElement("先生");
先生.Add(new XElement("名前", "江原先生"));
クラス.Add(先生);
生徒 = new XElement("生徒1");
生徒.Add(new XElement("名前", "大谷"));
クラス.Add(生徒);
xml.Save(@"sample.xml");
textBox1.Text = xml.Declaration.ToString();
textBox1.Text = xml.ToString();
}
実行してみると、うまくいきました!
躓いた点が一つあったのですが、<クラス>タグの定義の部分を「クラス = new XElement("クラス", "一組");」といったように値を入れてしまうと、階層構造が崩れました。子をぶら下げる箱として用意する場合には値を入れたらダメなんですかね。。
続きはこちら。