我正在尝试使用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的成员的value元素的文本?”的正确选择器是什么?
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");
});
}
答案 0 :(得分: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();
这将选择name
节点,其中"time"
作为文本,然后获取其父节点(包含成员节点)。然后使用成员节点作为获取value
节点的位置的上下文并返回其文本。我在你的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);
});