1

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# オブジェクトにもっときれいな方法で変換する方法 (まだわかりません) はありますか?

4

2 に答える 2

3

実際に何が必要かはわかりませんが、これがこれまでで最も簡単な解決策になると思います

private DataTable convertStringToDataTable(string xmlString)
{
   DataSet dataSet = new DataSet();
   StringReader stringReader = new StringReader(xmlString);
   dataSet.ReadXml(stringReader);
   return dataSet.Tables[0];
}

これは今はあまり役に立たないかもしれませんが、他の人が検索するのに役立つことを願っています.

于 2012-05-08T05:03:15.097 に答える
0

まず、DataSet の使用に反対する場合は、DataTable.ReadXML を使用できます。

于 2011-08-01T18:18:35.997 に答える