2011-08-01 35 views
1

在ASP.NET应用程序中,我有一个查询到SQL数据库的一些数据和一部分数据是XML字符串。我想要将这个XML字符串“检索”到ASP.NET应用程序中,并将其转换为DataTable对象。DataTable对象的XML字符串c#方法 - 需要的建议

我有SQL查询,它从Feeds表中选择所有提要(它们的标题,描述),并从相关表中选择附加数据(在这种情况下为提要标签)。我检索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对象。目前,我有它返回的DataTable此XML字符串的方法:

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

回答

0

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

+0

我试过了。它在DataTable.ReadXml()中使用'new StringReader(xmlStringForDataTable)'返回错误' – Janez

3

我不知道,你真正需要的,但我认为这将是这可能不是现在的你很大帮助最简单的办法不断

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

,我希望这将有助于其他搜索为了它。