XML字符串到DataTable对象的c#方法 - 需要建议

时间:2011-08-01 14:55:49

标签: c# xml datatable for-xml-path

在ASP.NET应用程序中,我在sql数据库中查询了一些数据,一部分数据是XML字符串。我想在检索到ASP.NET应用程序后将此XML字符串“转换”为DataTable对象。

我有SQL查询,从Feeds表中选择所有Feed(它们的标题,描述)和相关表中的其他数据(在这种情况下是feed的标签)。我在XML字符串中检索其他数据(我在sql中使用FOR XML PATH('')实现了这一点:

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;
} 

这种方法有点有效,但我相信有更好的解决方案。我不喜欢的一件事就是将额外的根元素附加到整个字符串以便能够转换它(如果我不这样做,整个方法失败)并且还使用DataSet来处理简单的DataTable。我怎么能改进这个方法/有一些方法(我还不知道)以更清晰的方式将xml字符串转换为DataTable C#对象?

2 个答案:

答案 0 :(得分:3)

我不知道,你真正需要什么,但我认为这将是最简单的解决方案

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

这对你来说可能没有太大帮助,我希望它能帮助其他人搜索它。

答案 1 :(得分:0)

对于初学者,如果您反对使用DataSet,则可以使用DataTable.ReadXML。