Разбор структуры XMLRPC с помощью jQuery - PullRequest
0 голосов
/ 07 сентября 2011

Я пытаюсь проанализировать ответ XMLRPC с помощью jQuery для создания таблицы, содержащей содержимое массива структур. Ответ выглядит так:

<?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>

Затем я анализирую ответ в моей функции обратного вызова. Первое прекрасно работает и находит все элементы структуры в ответе. 2-ой поиск пытается найти значение члена с именем 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 Ответ

1 голос
/ 07 сентября 2011

Вы можете разделить

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);
});
...