結果セットから XDocument を使用して手動で XML ファイルを作成しようとしましたか?
ここでは、MySql サーバーからデータを取得するためのサンプル コードを提供していません。また、mysql データ ストアを読み取るためのパラメーターが必要な例も提供していません。情報がほとんどなくても、(特定の列名を持つ) データ テーブルを取得し、単純な形式の xml ドキュメントを返す基本的なメソッドを提供できます。
public static XDocument CreatePlaylist(System.Data.DataTable DataTable)
{
var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
var xItem = new XElement("item");
foreach (var row in DataTable.Rows.OfType<System.Data.DataRow>())
xItem.Add(new XElement("list",
new XAttribute("name", row["name"].ToString()),
new XAttribute("videotitle", row["videotitle"].ToString()),
new XAttribute("link", row["link"].ToString()),
new XElement("thumb", row["thumb"].ToString())));
xDoc.Add(xItem);
return xDoc;
}
この小さなスニペットは単純です。データテーブルをパラメーターとして受け入れ、XDocument を作成するだけです。ここでの要件は、データテーブルに name、videotitle、link、thumb という列が必要です。
XDocument オブジェクトを返すこのメソッドを呼び出すだけで、XDocument の .ToString() メソッドを呼び出して xml を取得できます。ただし、落とし穴があります (常に落とし穴があります)。.ToString() メソッドが呼び出されたときに、XDocument に Xml 宣言が含まれていません。.Save() メソッドを呼び出すと、Xml 宣言が出力されます。
XDocument を Xml 宣言をそのままにして文字列に出力できる別の簡単な方法があります。これらの方法は次のとおりです。
public static string XDocToStringWithDeclaration(XDocument doc)
{
string xString;
using (var sw = new System.IO.MemoryStream())
{
using (var strw = new System.IO.StreamWriter(sw, System.Text.UTF8Encoding.UTF8))
{
doc.Save(strw);
xString = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray());
}
}
return xString;
}
メソッドは xDocument の Save() メソッドを呼び出しますが、それを MemoryStream に保存してから、メモリストリームを文字列として出力することがわかります。
すべてを結び付けるために、単純なコンソール アプリケーションを用意しました。これを見て、すべてがどのように組み合わされているかを理解してください。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var dt = new System.Data.DataTable();
dt.Columns.Add("name");
dt.Columns.Add("videotitle");
dt.Columns.Add("link");
dt.Columns.Add("thumb");
for (int i = 0, j = 5; i <= j; i++)
{
var row = dt.NewRow();
row["name"] = string.Format("video {0}", i);
row["videotitle"] = string.Format("video {0}", i);
row["link"] = string.Format("/someurl/video{0}.avi", i);
row["thumb"] = string.Format("/someurl/video{0}.png", i);
dt.Rows.Add(row);
}
var xmlDoc = CreatePlaylist(dt);
Console.WriteLine(XDocToStringWithDeclaration(xmlDoc));
Console.WriteLine("{0}Finished... Press a key", Environment.NewLine);
Console.ReadKey();
}
public static string XDocToStringWithDeclaration(XDocument doc)
{
string xString;
using (var sw = new System.IO.MemoryStream())
{
using (var strw = new System.IO.StreamWriter(sw, System.Text.UTF8Encoding.UTF8))
{
doc.Save(strw);
xString = System.Text.UTF8Encoding.UTF8.GetString(sw.ToArray());
}
}
return xString;
}
public static XDocument CreatePlaylist(System.Data.DataTable DataTable)
{
var xDoc = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
var xItem = new XElement("item");
foreach (var row in DataTable.Rows.OfType<System.Data.DataRow>())
xItem.Add(new XElement("list",
new XAttribute("name", row["name"].ToString()),
new XAttribute("videotitle", row["videotitle"].ToString()),
new XAttribute("link", row["link"].ToString()),
new XElement("thumb", row["thumb"].ToString())));
xDoc.Add(xItem);
return xDoc;
}
}
}
これが役立つことを願っています。
乾杯、ニコ