我在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
答案 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