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

发布于 2024-11-27 13:59:32 字数 1788 浏览 4 评论 0原文

在 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# 对象?

In ASP.NET application I have a query onto sql database for some data and one part of the data is XML string. I want to "convert" this XML string into DataTable object once retrieved into ASP.NET application.

I have SQL query which select all feeds (their titles, descriptions) from Feeds table and additional data from related tables (in this case tags of feeds). I retrieve additional data in XML string (I achieve this using FOR XML PATH('') in 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

And the XML result of this query is (value of FeedTagsXML column):

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

Now all I need is to convert this string into DataTable object. Currently I have a method which returns DataTable for this xml string:

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

This approach kinda works but I am sure there are better solutions than this. One of the things I don't like for example is appending additional root element to whole string to be able to convert it (if I don't do this whole method fails) and also using DataSet for simple DataTable. How could I improve this method / is there some way (I don't know about yet) to convert xml string to DataTable C# object in a much cleaner way?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

烟柳画桥 2024-12-04 13:59:32

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

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

这可能对你现在没有多大帮助,我希望它能帮助其他人寻找它。

I don't know, what you actually need, but i think this would be the simplest solution ever

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

This might not be of much help for you now, i hope it will help others searching for it.

妖妓 2024-12-04 13:59:32

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

For starters, you could use DataTable.ReadXML, if you are against using a DataSet.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文