【问题标题】:How to get XML data from a column in an SQL table?如何从 SQL 表的列中获取 XML 数据?
【发布时间】:2011-04-28 01:53:10
【问题描述】:

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

<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

【问题讨论】:

    标签: asp.net xml


    【解决方案1】:

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

    一旦有了 XmlReader,您就可以使用 Load 方法将其直接加载到 XDocument 中。

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

    【讨论】:

    • 我检查了关于 XDocument.Parse 的链接,但它只接受字符串类型作为参数。我拥有的列是 Xml 类型。如果我将它从 XML(SQL 数据类型)存储到字符串 xmlValue,那么所有的 xml 标记都将消失。所以当我尝试使用 XDocument.Parse(xmlValue) 时,它会抛出一个错误“字符串未被识别为有效的 Uri。”
    • 我实际上在使用 XmlReader 时遇到了问题,因为我们有一个单独的类用于所有数据访问。当我尝试这种方法时,我得到“阅读器关闭时无效的阅读尝试”。我认为这是因为数据访问类将xml结果返回给代码隐藏后,数据访问类关闭了XmlReader。无论如何,感谢您告诉我有关 XDocument 的信息。它给了我一个替代解决方案。我将在 SQL 上将 XML 文档存储为字符串而不是 XML 类型(我知道这不是一个非常优雅的解决方案)。然后,当我检索它时,我将使用 XDocument.Parse :D
    • @Rome:您对数据访问类有任何控制权吗?您能否更改它们以正确读取 XML 数据并返回 xml 文档而不是字符串?
    • 您可以使用 XDocument.Load(MyDataReader.GetSqlXml(i).CreateReader()) 而不是 .Parse。
    【解决方案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 或其他任何东西来操作它。

    【讨论】:

    • 注意 ExecuteScalar 只能读取 2033 个字符。上面的一切都被削减了!
    【解决方案3】:

    嗯,经过一些更深入的研究,我能够回答我自己的问题。 :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

    【讨论】:

      猜你喜欢
      • 2021-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-15
      • 1970-01-01
      • 2013-01-09
      • 2015-11-19
      • 1970-01-01
      相关资源
      最近更新 更多