2011-04-28 59 views
7

我在SQL中有一个表,其中一列是一个XML数据类型。我如何能够从SQL到ASP.NET(C#)代码隐藏中获得它的价值?我想将它作为Xml类型存储,而不是字符串类型,因为我需要操作其中的值和属性。我试着把它放在一个字符串类型变量上,我得到的是这样的:AAYYYNYNYNStarLight。我想代之以:如何从SQL表中的列中获取XML数据?

<ANSWERS> 
<Answer item="ddl_3">A</Answer> 
<Answer item="ddl_8">A</Answer> 
<Answer item="ddl_13">Y</Answer> 
<Answer item="ddl_16">Y</Answer> 
<Answer item="ddl_19">Y</Answer> 
<Answer item="ddl_22">N</Answer> 
<Answer item="ddl_26">Y</Answer> 
<Answer item="ddl_30">N</Answer> 
<Answer item="ddl_34">Y</Answer> 
<Answer item="ddl_38">N</Answer> 
<Answer item="ddl_42">StarLight</Answer> 
</ANSWERS> 

我该怎么做,并能够操纵每个节点?我是一个关于XML的完整小白,任何帮助都会被大量使用。 :)

编辑:清理XML

回答

2

我假设你正在使用中获取数据出来的SQL Server的直线上升ADO.NET,而不是像实体框架的ORM。如果我正确阅读文档here,则XML列将作为XmlReader公开,您可以使用GetSqlXml方法检索该列。

一旦你有一个XmlReader,你可以使用Load方法直接将它加载到XDocument中。

您可能会感兴趣的另一件事是有两个不同的XML名称空间,看看这个问题关于XDocument and XmlDocument之间的差异。

+0

我检查了关于该XDocument.Parse的链接,但它只接受字符串类型作为参数。而我的列是一个Xml类型。如果我将它从XML(SQL数据类型)存储到字符串xmlValue,则所有xml标记都将消失。所以当我尝试使用XDocument.Parse(xmlValue)时,它会抛出一个错误“该字符串未被识别为有效的Uri。” – Rome 2011-04-28 03:53:11

+0

@罗姆:哦,我误解了你的问题,让我编辑。 – R0MANARMY 2011-04-28 03:54:44

+0

我实际上有一个使用该XmlReader的问题,因为我们有一个单独的类用于所有数据访问。当我尝试这种方法时,我得到了“阅读器关闭时无效尝试阅读”。我认为这是因为在数据访问类将xml结果返回到代码隐藏之后,数据访问类将关闭XmlReader。无论如何,谢谢你告诉我关于XDocument。它给了我一个替代解决方案。我会将SQL文档中的XML文档存储为一个字符串而不是XML类型(我知道这不是一个非常优雅的解决方案)。然后,当我检索它时,我将使用XDocument.Parse:D – Rome 2011-04-28 05:51:35

2

如果你在你的C#代码做这样的事情,你一定会正确地从数据库中读取XML:

// setup connection string and query statement 
string connStr = "server=(local);database=Test;integrated security=SSPI;"; 
string query = "SELECT XmlContent FROM dbo.XmlTest2 WHERE ID = @ID"; 

// wrap your SqlConnection and SqlCommand in using blocks... 
using(SqlConnection _con = new SqlConnection(connStr)) 
using(SqlCommand _cmd = new SqlCommand(query, _con)) 
{ 
    // setup parameter for _cmd 
    _cmd.Parameters.Add("@ID", SqlDbType.Int).Value = 1; 

    _con.Open(); 
    string contentsOfYourXml = (string)_cmd.ExecuteScalar(); 
    _con.Close(); 
} 

当你把这个字符串到ASP.NET页面,但是,ASP。 .NET运行时将尝试进行XSL转换,并且默认情况下,如果不指定任何内容,则XSLT将仅返回所有元素值 - >这就是您看到的字符串。

但是从数据库中读取最明显的作品就好了!一旦你有了包含你所有XML的字符串,你可以随心所欲地使用它 - 用Linq-to-XML或其他方法处理它。

1

好吧,经过几次更深入的研究,我能够回答我自己的问题。 :d

这里是代码:

private void ddl_Eval_SelectedIndexChanged (Object sender, System.EventArgs e) 
{ 
    //Response.Write(ddl_Eval.SelectedValue.ToString() + " " + "value: " + ddl_Eval.SelectedIndex); 

    dtEval = new DataTable(); 
    dtEval = data.GetEvaluation2(); 
    DataView dvEval = dtEval.DefaultView; 

    string xmlDoc = String.Empty; 

    foreach (DataRowView drvEval in dvEval) 
    { 
     if (drvEval.Row["EvaluationID"].ToString() == ddl_Eval.SelectedValue.ToString()) 
     { 
      xmlDoc = drvEval.Row["EvalAnswers"].ToString(); 
     } 
    } 

    XDocument xdoc = new XDocument(); 
    xdoc = XDocument.Parse(xmlDoc); 

    foreach (XElement child in xdoc.Root.Elements("Answer")) 
    { 
     Response.Write(child.Attribute("item").Value + " " + child.Value + "<br />"); 
    } 

} 

现在,我能够得到答案的价值和属性项的值。 :D

相关问题