2013-07-10 24 views
2

我有一个将对象序列化到SQL Server XML字段的方法。我在Managmenet Studio中的SQL服务器中看到XML,现在我需要在HTML页面中显示它。SQL中的XML字段

我使用AJAX函数调用到一个WebMethod,如下它调用一个存储过程:

using (conn){ 
    using (SqlCommand cmd = new SqlCommand()){ 

     conn.Open(); 

     cmd.CommandText = "GetMessage_Sel"; 
     cmd.CommandType = CommandType.StoredProcedure; 
     cmd.Parameters.Add("@messageId", SqlDbType.VarChar, 50).Value = str; 
     cmd.Connection = conn; 

     try{ 
      rdr = cmd.ExecuteReader(); 

      if (rdr.HasRows){ 

       while (rdr.Read()){ 
        returnValue1 = rdr.GetString(0); 
        returnValue2 = rdr.GetString(1); 
       }  
      } 

      else{ 
       Console.WriteLine("No rows found."); 
      } 
      rdr.Close(); 
     } 

     catch (Exception err){ 
      // handle the error 
      //messageInsert = false; 
     } 

     finally{ 
      conn.Close(); 
     } 
    } 
} 

return new string[] {returnValue1,returnValue2}; 

的AJAX因此设置如下:

$('.view-details').click(function (e) { 
    e.preventDefault(); 

    $('#ticket-id').text("Ticket id: " + $(this).closest('tr').children().eq(1).html()); 

    $.ajax({ 
     type: "POST", 

     url: "Default.aspx/PopulatePopUp", 

     cache: false, 
     data: "{'arg':'" + $(this).closest('tr').children().eq(1).html() + "'}", 
     contentType: "application/json; charset=utf-8", 

     dataType: "json", 

     success: function (msg) 
     { 
      $("#CompleteMessage").text(msg.d[0]); 
      $("#lblaka").text(msg.d[1]); 
     } 

    }); 
} 

所以#lblaka显示整个XML消息,但我需要将其分解为更具可读性的方式。所以eithe在我的WebMethod或Ajax的功能,我如何通过rdr.GetString(1)迭代,所以像这样

foreach (var item in rdr.GetString(1)) { 
    string 1 = xml node value 1 ..... etc 
} 

编辑:

这里是被存储在XML的一个例子。

<Person xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <AKA> 
     <string>Name 1</string> 
     <string>Name 2</string> 
    </AKA> 
    <Countries> 
     <string>USA</string> 
     <string>UK</string> 
    </Countries> 
    <Names> 
     <string>Name 1</string> 
     <string>Name 2</string> 
    </Names> 
    <Gender>Male</Gender> 
</Person> 

回答

2

这里是你如何能够用jQuery做到这一点:

声明此功能:

function GetNestedElements(aThis, name) { 
$(aThis).find(name).each(function(index){    
     $("#lblaka").append('<span>'+ name +' : '); 
     $(this).find('string').each(function(index){    
      $("#lblaka").append($(this)); 
      }); 
     $("#lblaka").append('</span><br/>'); 
    });  
} 

使用该在你成功的呼叫:

var xml = $.parseXML(msg), 
$xml = $(xml); 
$xml.find('Person').each(function(index){    
    GetNestedElements(this, 'AKA'); 
    GetNestedElements(this, 'Countries'); 
    GetNestedElements(this, 'Names'); 

    var gender = $(this).find('Gender').text();     
      $("#lblaka").append('<span>Gender : ' + gender + '</span><br/>'); 

     }); 

请参见本文的jsfiddle对于工作版本(选择“显示人物”以查看它):

http://jsfiddle.net/MZ5Xs/2/

+0

此方法的一个小问题。如果我点击了Click按钮,那么同样的信息会一次又一次地写出来。我想这是.append方法 – CSharpNewBee

+0

嗨,对不起。我已更新jsFiddle以显示清除。选择'显示人物'可以在http://jsfiddle.net/MZ5Xs/2/ – hutchonoid

+0

看到这个动作非常好。只需要确定哪种方法可以更快地使用/。谢谢你们 – CSharpNewBee

1

如果在你的SQL字符串的纯XLM你可以加载串入并的XDocument像这样和查询使用LINQ让你列表遍历。

XDocument xDoc = XDocument.Parse(rdr.GetString(1)); 
var query = xDoc.Descendants("AKA").Elements("string").ToList(); 

//If you want to add them to an Array 
string[] array = new string[query.Count() -1]; 
int i = 0 
// this will add the values Name 1 and Name 2 to an array 
foreach (var element in query) 
{ 
    array[i] = element.Value; 
    i++; 
}