如何解析这个XML Ajax响应?

4

我正尝试使用jQuery从Java Servlet或Action接收通过Ajax检索的一些数据进行解析。这是我最糟糕的一周,一切都很混乱。以下是我的XML响应:

<ajax-response>
    <response>
        <item>
            <name>ok</name>
            <value>true</value>
        </item>
        <item>
            <name>menuDiv</name>
            <value> Some HTML Menu</value>
        </item>
    </response>
</ajax-response>

我正在尝试获取只包含“menuDiv”值的内容,即“一些HTML”:

$.ajax({
    type: "GET",
    url: basePath+'mostrarMenu.do',
    dataType: "xml",
    success: parseXml
});

function parseXml (xml) {
    var menu = $(xml).find("item");
    menu.each(function(i, value) {
        alert(value[0]);
        if (value == 'menuDiv') {
            alert("Esto es el menudiv:"+value);
        }

        if (( value != null ) || ( value != '') || ( value != ' ')) {
            $('#menuDiv').append(value);
        } 
        else 
            alert ("anda el else");
    });

alert(value[0]);if (value == 'menuDiv') { 都没有返回任何内容,最后的if 使菜单可见,但是其他项目也会出现,就像一个漂亮的菜单之前出现了一个true

任何帮助或建议都将非常感激。谢谢。

编辑2:

使用此函数,现在我正在获取纯文本(未呈现的html)和所有“<items>”:

function parseXml (xml) {
        var menu = $(xml).find("item");
        menu.each(function(i, value){
            if(( value != null ) || ( value != '') || ( value != ' ')){
                $('#menuDiv').append($(value));
            } else alert ("anda el else");
        });
     }
    }

我已经更改了dataType: 'html',我的菜单可见,但我一直在尝试仅选择一个XML中的ITEM而不是所有ITEM...


1
在分派结果集之前,你能否将其解析成json并在服务器端进行处理?这样可能会使长期运行更容易些。 - MetalFrog
@MetalFrog有一个很棒的想法。使用JavaScript解析JSON会更容易得多。但如果不行,总会有其他人来回答:) 很好的问题! +1 - jamesmortensen
我会尝试,但我觉得我做不到。 - Leandro Cusack
1个回答

1
第一个问题是,当您执行find("item")时,返回的是整个子树:
    <item>
        <name>ok</name>
        <value>true</value>
    </item>

所以你的循环需要改为:

if ($(value).find("name")[0].innerHTML == 'menuDiv') {
    alert("Esto es el menudiv:"+value);
}

然后可以通过 value.find("value")[0].innerHTML 获取值为 "Some HTML Menu" 的内容。

这里没有进行任何错误检查(具体来说,我假设 find 返回一个非空数组,至少有一个元素),但您可以自行添加。


我想我以前尝试过这个,但它返回值.find()不是一个函数。我会再试一次并告诉你发生了什么。 - Leandro Cusack
嗯,当我测试它时,我将菜单元素存储为单独的变量,并在它们上运行.find()。很快会回复你。 - Ansari
我也是,我定义了一个变量:var allow = value.find("name")[0].innerHTML,然后Firebug报错说value.find()不是一个函数... - Leandro Cusack
我刚刚编辑了我的回答 - 你必须在 $(value) 而不是 value 上运行 find - Ansari
这只是在Firebug中还是在实际执行中?我没有得到CDATA标签...(在Chrome中测试) - Ansari
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接