ASP.NET アプリケーションでは、一部のデータについて SQL データベースにクエリを実行し、データの一部は XML 文字列です。この XML 文字列を ASP.NET アプリケーションに取得したら、DataTable オブジェクトに "変換" したいと考えています。
Feeds テーブルからすべてのフィード (タイトル、説明) を選択し、関連テーブル (この場合はフィードのタグ) から追加データを選択する SQL クエリがあります。XML 文字列で追加データを取得します ( FOR XML PATH('')
SQL でこれを実現します)。
SELECT
F.ID, F.Title, F.Text,
(SELECT
T.TagID, T.TagName
FROM
sn.Tag AS T
INNER JOIN
sn.FeedTag AS FT ON FT.TagID = T.TagID
WHERE
FT.FeedID = F.FeedID
FOR
XML PATH('tag')
)
AS FeedTagsXML
FROM
sn.Feed AS F
WHERE
F.ID = 12876
このクエリの XML 結果は (FeedTagsXML
列の値) です。
<tag>
<TagID>114</TagID>
<TagName>Test 1</TagName>
</tag>
<tag>
<TagID>115</TagID>
<TagName>Test 2</TagName>
</tag>
<tag>
<TagID>116</TagID>
<TagName>test 3</TagName>
</tag>
<tag>
<TagID>117</TagID>
<TagName>Test 4</TagName>
</tag>
あとは、この文字列を DataTable オブジェクトに変換するだけです。現在、この xml 文字列の DataTable を返すメソッドがあります。
public DataTable GetDataTableFromXML(string xmlStringForDataTable)
{
//read into dataset
DataSet dataSet = new DataSet();
xmlStringForDataTable = "<items>" + xmlStringForDataTable+ "</items>";
dataSet.ReadXml(new StringReader(xmlStringForDataTable));
DataTable dt = new DataTable();
//return single table inside of dataset
if (dataSet.Tables.Count > 0)
{
dt = dataSet.Tables[0];
}
return dt;
}
このアプローチはちょっとうまくいきますが、これよりも優れた解決策があると確信しています。たとえば、私が気に入らないことの 1 つは、文字列全体に追加のルート要素を追加して変換できるようにすることです (このメソッド全体を実行しないと失敗します)。また、単純な DataTable に DataSet を使用します。このメソッドを改善するにはどうすればよいですか / xml 文字列を DataTable C# オブジェクトにもっときれいな方法で変換する方法 (まだわかりません) はありますか?