为什么jQuery无法解析某些XML节点?

3
我通过Ajax调用网页。其响应的一部分是一个小的XML块。我尝试解析它,但jQuery似乎只能找到其中的一些节点。例如:
<aaa>
   <text>bbb</text>
   <image>test</image>
</aaa>

它可以很好地找到文本,但从不找到图像节点。
但是,如果我将拼写从“image”更改为“zimage”,它就会找到它。在通过jQuery解析XML时,“image”一词是否被保留?
我的jQuery代码非常简单...
$(data).find("zimage").each(function() {
    alert("node found");
});

那段代码可以运行,但当我使用这个...

$(data).find("image").each(function() {
    alert("node found");
});

它从未找到任何东西。

2
一个小的XML块?这是被视为XML还是你的意思是响应是一个带有一些无效标签的HTML文档? - Quentin
AJAX响应由几个分隔的项目组成...最后一个项目是一个小的XML块。 - gshauger
在尝试对其运行选择器引擎之前,您对这个小块的XML做了什么? - Quentin
我只是将响应进行了标记化,然后在第三个标记上运行选择器引擎,该标记包含XML。 - gshauger
如果您正在对响应进行标记化(tokenizing),则必须在使用jQuery查询之前将最后一个标记(即XML字符串)转换为XML DOM。参见这些相关问题(1)(2)。如Vivin所建议的,如果您使用的是1.5版本,则使用$.parseXML - Anurag
3个回答

3
你正在使用哪个版本的jQuery?看起来jQuery 1.5有一个parseXML()函数:parseXML()
var data="<aaa><text>bbb</text><image>test</image></aaa>";
var xmlDoc = jQuery.parseXML(data);
var $xmlDoc = jQuery(xmlDoc);

$xmlDoc.find("image").each(function() {
   alert("node found"); //this alert pops up because find() returns [image]
});

如果您有控制使用的jQuery版本,可以尝试将其替换为1.5版本,这将使您可以访问parseXML()函数。看起来这个函数不会对XML进行任何后处理,因此您得到的DOM与XML匹配。这样,您也不需要知道哪些标签被修改,这意味着需要处理的特殊情况更少。

1

因为 JavaScript 正在将你的 "data" 转换成这样:

<aaa><text>bbb</text><img>test</aaa>

因此,这个可以工作:

var xml = "<aaa><text>bbb</text><image>test</image></aaa>";
var data = $("<div />", { html: xml });

data.find("img").each(function() {
    alert("node found");
});

这就是为什么在几乎所有需要解析XML的情况下最好使用XML库。你永远不知道会出现什么怪癖。


有没有办法以 jQuery 转换的形式输出 XML?为了我的调试目的?换句话说,你是怎么得到那个字符串的?另外,为什么要进行转换?谢谢! - gshauger
像这样:alert( data.html() ); 或 alert( data[0].innerHTML ); - mattsven

1

您需要将XML转换为DOM,以便由jQuery遍历。 jQuery不能直接处理XML,但可以通过浏览器提供的DOM进行选择。

这里有一个插件,可以返回XML字符串的DOM: http://outwestmedia.com/jquery-plugins/xmldom/


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