如何从SQL表中的列获取XML数据?

时间:2011-04-28 01:53:11

标签: asp.net xml

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

<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

3 个答案:

答案 0 :(得分:2)

我假设您使用直接ADO.NET而不是像Entity Framework这样的ORM从SQL Server获取数据。如果我正确阅读文档here,则XML列将显示为XmlReader,您可以使用GetSqlXml方法进行检索。

获得XmlReader后,可以使用Load方法将其直接加载到XDocument中。

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

答案 1 :(得分: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将只返回所有元素值 - &GT;那是你看到的字符串。

但是从数据库中读取绝对可以正常工作!一旦你拥有包含所有XML的字符串,你可以随心所欲地使用它 - 用Linq-to-XML或其他任何东西来操作它。

答案 2 :(得分:2)

嗯,经过一些更激烈的研究,我能够回答我自己的问题。 :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 />");
    }

}

现在,我可以获得Answer的值和属性项的值。 :d