是的,这可能有点难以解释。
我有一个jQuery AJAX请求正在读取一个XML文件,其布局类似于:
<root>
<nodes>
<node type="typeOne" name="nodeNameOne" />
<node type="typeOne" name="nodeNameTwo" />
<node type="typeTwo" name="nodeNameThree" />
<node type="typeThree" name="nodeNameFour" />
<node type="typeFour" name="nodeNameFive" />
</nodes>
<otherNodes>
<otherNode name="nodeNameOne">Some value</otherNode>
<otherNode name="nodeNameTwo">Some value</otherNode>
</otherNodes>
</root>
这不是我可以控制的; XML文件由第三方工具生成。
我想要做的是读取<node>
s'name属性的值,然后使用它来从相应的<otherNode>
中提取值(如果存在)。
这就是我在成功回调函数中所拥有的:
function ParseFile(data, status, request){
var types = ['typeOne', 'typeTwo']; //I don't care about all the <node>s
alert(typeof data); //displays "object"
types.each(function(entry, index){
alert(typeof data); //displays "object"
var typeNodes = jQuery(data).find('node[type="'+entry+'"]');
typeNodes.each(function(){
alert(typeof data); //displays "undefined"
var name = jQuery(this).attr('name');
/* The data object is undefined once you get inside this loop,
so the following doesn't work. */
var otherNode = jQuery(data).find('otherNode[name="'+name+'"]').text();
});
});
}
问题是,我似乎无法从第二个.else()
循环中访问数据变量。即使我在第一个var newData = data;
内声明了一个变量,newData也是未定义的。
答案 0 :(得分:0)
这不起作用的原因是jQuery函数修改data
并尝试将其设置为它认为您已传入的html片段。但是,您没有将有效的html传递到它,所以它将其设置为undefined。您需要将数据复制到另一个变量,而不是仅仅设置一个引用。
尝试
var myData = data.substr(0);
答案 1 :(得分:0)
var types = ['typeOne', 'typeTwo'];
types
不是jQuery对象,它是一个数组,您可以使用each
函数进行迭代。
// This will not work
types.each(function(entry, index){
//... iteration processing
};
对于types
变量,使用for循环或将其转换为jQuery对象。
答案 2 :(得分:0)
这不是您具体问题的答案,但您可以使用map()
将其简化为源于此的内容:
// Returns an array of ["Some value", "Some value", ""]
$xml.find('node[type=typeOne], node[type=typeTwo]').map(function() {
return $xml.find('otherNode[name=' + this.getAttribute('name') + ']').text();
});
假设$ xml是包含jQuery包装的XML的变量。例如,我在控制台上将其定义为:
var $xml = $('<root>
<nodes>
<node type="typeOne" name="nodeNameOne" />
<node type="typeOne" name="nodeNameTwo" />
<node type="typeTwo" name="nodeNameThree" />
<node type="typeThree" name="nodeNameFour" />
<node type="typeFour" name="nodeNameFive" />
</nodes>
<otherNodes>
<otherNode name="nodeNameOne">Some value</otherNode>
<otherNode name="nodeNameTwo">Some value</otherNode>
</otherNodes>
</root>');