2

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

我使用 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 消息,但我需要将其分解为更易读的方式。所以无论是在我的 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>
4

2 回答 2

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/

于 2013-07-10T14:51:23.467 回答
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++;
}
于 2013-07-10T14:18:45.733 回答