LINQ To XMLを用いたXMLファイルの書き出し方法を紹介します。
XMLファイルを書き出すにあたり、はじめにXMLの構造を作成します。XElementクラスを用いてXMLの構造を作成します。
XElementのコンストラクタのひとつは
private void button11_Click(object sender, EventArgs e)
{
XElement root =
new XElement("root",
new XElement("item",
new XElement("Code", "CD-010"),
new XElement("Name", "Penguin Cookie"),
new XElement("Price", "250")
),
new XElement("item",
new XElement("Code", "CD-023"),
new XElement("Name", "Whale Candy"),
new XElement("Price", "80")
),
new XElement("item",
new XElement("Code", "CD-046"),
new XElement("Name", "Bear Potato"),
new XElement("Price", "180")
)
);
FileStream fs = new FileStream(textBox3.Text, FileMode.Create);
root.Save(fs);
fs.Close();
fs.Dispose();
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<item>
<Code>CD-010</Code>
<Name>Penguin Cookie</Name>
<Price>250</Price>
</item>
<item>
<Code>CD-023</Code>
<Name>Whale Candy</Name>
<Price>80</Price>
</item>
<item>
<Code>CD-046</Code>
<Name>Bear Potato</Name>
<Price>180</Price>
</item>
</root>
空要素を作成する場合は
private void button12_Click(object sender, EventArgs e)
{
XElement root =
new XElement("root",
new XElement("item",
new XElement("Empty"),
new XElement("Code", "CD-010"),
new XElement("Name", "Penguin Cookie"),
new XElement("Price", "250")
),
new XElement("item",
new XElement("Code", "CD-023"),
new XElement("Name", "Whale Candy"),
new XElement("Price", "80")
),
new XElement("item",
new XElement("Empty"),
new XElement("Code", "CD-046"),
new XElement("Name", "Bear Potato"),
new XElement("Price", "180")
)
);
FileStream fs = new FileStream(textBox3.Text, FileMode.Create);
root.Save(fs);
fs.Close();
fs.Dispose();
}
<?xml version="1.0" encoding="utf-8"?>
<root>
<item>
<Empty />
<Code>CD-010</Code>
<Name>Penguin Cookie</Name>
<Price>250</Price>
</item>
<item>
<Code>CD-023</Code>
<Name>Whale Candy</Name>
<Price>80</Price>
</item>
<item>
<Empty />
<Code>CD-046</Code>
<Name>Bear Potato</Name>
<Price>180</Price>
</item>
</root>
というツリーがあったとき
TREE 1のitem1とTREE 3のitem1はクローンされたコピーになりますが、
TREE 3のitem2とTREE 2のitem2は同じXElementのインスタンスになります。
これは、新しいノード(XElement)に既に親があり、別の XML ツリーの一部となっている場合は、新しいノード(XElement)が複製され、新しく複製されたコンテンツが XML ツリーにアタッチされるためです。
private void button14_Click(object sender, EventArgs e)
{
XElement rootElem1 = new XElement("root",
new XElement("item1", 1)
);
XElement item2 = new XElement("item2", 2);
XElement rootElem2 = new XElement("root",
rootElem1.Element("item1"),
item2
);
if (rootElem1.Element("item1") == rootElem2.Element("item1")) {
textBox4.Text += "rootElem1のitem1 と rootElem2のitem1 は同じものです。\r\n";
}
else {
textBox4.Text += "rootElem1のitem1 と rootElem2のitem1 はクローンコピーです。\r\n";
}
if (item2 == rootElem2.Element("item2")) {
textBox4.Text += "item2 と rootElem2のitem2 は同じものです。\r\n";
}
else {
textBox4.Text += "item2 と rootElem2のitem2 はクローンコピーです。\r\n";
}
}