从SQL获取xml属性

时间:2010-11-21 11:25:31

标签: c# xml

对于此xml(在SQL 2005 XML列中):

<doc> 
 <a>1</a> 
 <b ba="1" bb="2" bc="3" /> 
 <c bd="3"/> 
<doc> 

我希望能够使用C#windows窗体应用程序检索属性(ba,bb,bc,bd)的名称而不是内部的值。

2 个答案:

答案 0 :(得分:1)

尝试这样的事情 - 第一种方法将从数据库加载XML字符串(调整连接字符串并查询到您自己的数据库,服务器,表,列名称),第二种方法将解析从中加载的XML字符串根据您上一个问题的答案,将数据库放入属性名称列表中:

 static void Main(string[] args)
    {
        string xmlContent = GrabStringFromDatabase(1);
        List<string> attributeNames = ParseForAttributeNames(xmlContent);

        Console.WriteLine("Your XML attributes are: {0}", string.Join(",", attributeNames.ToArray()));
    }

    private static string GrabStringFromDatabase(int ID)
    {
        string result = string.Empty;
        string connection = "server=(local);database=test;integrated security=SSPI";
        string query = "SELECT XmlContent FROM dbo.TestXml WHERE ID = @ID";

        using(SqlConnection _con = new SqlConnection(connection))
        using (SqlCommand _cmd = new SqlCommand(query, _con))
        {
            _cmd.Parameters.Add("@ID", SqlDbType.Int).Value = ID;

            _con.Open();
            result = _cmd.ExecuteScalar().ToString();
            _con.Close();
        }

        return result;
    }

    private static List<string> ParseForAttributeNames(string xmlContent)
    {
        List<string> attributeNames = new List<string>();

        XDocument xmlDoc = XDocument.Parse(xmlContent);

        var nodeAttrs = xmlDoc.Descendants().Select(x => x.Attributes());

        foreach (var attrs in nodeAttrs)
        {
            foreach (var attr in attrs)
            {
                attributeNames.Add(attr.Name.LocalName);
            }
        }

        return attributeNames;
    }

答案 1 :(得分:0)

在您的情况下,有两种方法可以执行此操作:

  • 如果您可以在SQL服务器上创建存储过程:
    您可以创建一个存储过程,将XML反汇编成列,并轻松地SELECT它们并让C#应用程序处理它,就像它是一个包含列和行的表一样。

  • 如果你不能:
    您可以使用SqlXml命名空间中的System.Xml在C#中反汇编XML。

这两种方式都用例子很好地解释了:
http://msdn.microsoft.com/en-us/library/ms345117(SQL.90).aspx#sql2k5xml_topic4