XML 字符串到 DataTable 对象的 C# 方法 - 需要建议
在 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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我不知道你真正需要什么,但我认为这将是有史以来最简单的解决方案
这可能对你现在没有多大帮助,我希望它能帮助其他人寻找它。
I don't know, what you actually need, but i think this would be the simplest solution ever
This might not be of much help for you now, i hope it will help others searching for it.
对于初学者,如果您反对使用 DataSet,则可以使用 DataTable.ReadXML。
For starters, you could use DataTable.ReadXML, if you are against using a DataSet.