2011-09-07 492 views
0

我想使用jQuery解析XMLRPC響應來創建一個包含結構數組內容的表。答案如下:使用jQuery解析XMLRPC結構

<?xml version="1.0"?> 
<methodResponse><params><param><value><array><data> 
    <value><struct><member><name>time</name><value>1315415195</value></member><member><name>level</name><value>DEBUG</value></member><member><name>thread</name><value>0x805e558</value></member><member><name>message</name><value>glib_syslog_get_log_messages</value></member></struct></value> 
    <value><struct><member><name>time</name><value>1315415160</value></member><member><name>level</name><value>DEBUG</value></member><member><name>thread</name><value>backup-Backups</value></member><member><name>message</name><value>Sleeping 5 minutes</value></member></struct></value> 
    .... 
</data></array></value></param></params></methodResponse> 

然後我在回調函數中解析響應。第一個很好的工作,並找到響應中的所有結構元素。第二個find試圖找到名稱爲time的成員的值,但是隻是再次返回struct元素。 「找到名爲X的會員的價值元素的文本?」的正確選擇器是什麼?

function loadStatusDone(data) { 
    if(!data) { 
     return; 
    } 

//first, must clean the content viewer 
$("table#tableStatus tbody").children().remove(); 
$(data).find('struct').each(function(){ 
    var ts = $(this).find("member name:contains(time) :parent value").text(); 
    var level = "level"; 
    var thread = "thread"; 
    var message = "some message"; 

    var html = "<tr>" + 
    "<td>" + ts + "</td>" + 
    "<td>" + level + "</td>" + 
    "<td>" + thread + "</td>" + 
    "<td>" + message + "</td>" + 
    "</tr>"; 


    $("table#tableStatus tbody").append(html); 
    $("table").trigger("update"); 
}); 
} 

回答

1

您可以拆分

var ts = $(this).find("member name:contains(time) :parent value").text(); 

到:

var $mem = $(this).find('member name:contains(time)').parent(), 
    ts = $('value', $m).text(); 

將與"time"選擇name節點作爲文本,然後獲取它的父(這是包含成員節點)。然後使用成員節點作爲獲取節點的上下文並返回其文本。我在你的XML上測試了它,它似乎對我有用。

我的測試代碼

//dirty version of your XML 
var $xml = '<methodResponse><params><param><value><array><data><value><struct><member><name>time</name><value>1315415195</value></member><member><name>level</name><value>DEBUG</value></member><member><name>thread</name><value>0x805e558</value></member><member><name>message</name><value>glib_syslog_get_log_messages</value></member></struct></value><value><struct><member><name>time</name><value>1315415160</value></member><member><name>level</name><value>DEBUG</value></member><member><name>thread</name><value>backup-Backups</value></member><member><name>message</name><value>Sleeping 5 minutes</value></member></struct></value></data></array></value></params></methodResponse>'; 

$xml.find('struct').each(function(){ 
    var $m = $(this).find('member name:contains(time)').parent(), 
     ts = $('value', $m).text(); 

    console.log(ts); 
}); 
+0

您的岩石。謝謝! –