1

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

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

这种方法有点工作,但我相信有比这更好的解决方案。例如,我不喜欢的一件事是将额外的根元素附加到整个字符串以便能够转换它(如果我不这样做,整个方法会失败),并且还将 DataSet 用于简单的 DataTable。我该如何改进这种方法/是否有某种方法(我还不知道)以更清洁的方式将 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 回答