我喜欢Javascript代码的一些帮助我正在编写以从NOAA xml文件中提取天气数据(从这里下载:http://graphical.weather.gov/xml/SOAP_server/ndfdXML.htm)。现在我只是将XML的相关部分粘贴为字符串:
var xmlDoc = $.parseXML("<data>\
<weather time-layout=\"k-p3h-n40-2\">\
<name>Weather Type, Coverage, and Intensity</name>\
<weather-conditions/>\
<weather-conditions/>\
<weather-conditions/>\
<weather-conditions>\
<value coverage=\"areas\" intensity=\"none\" weather-type=\"sun\" qualifier=\"none\">\
<visibility xsi:nil=\"true\"/>\
</value>\
</weather-conditions>\
<weather-conditions>\
<value coverage=\"areas\" intensity=\"none\" weather-type=\"rain\" qualifier=\"none\">\
<visibility xsi:nil=\"true\"/>\
</value>\
</weather-conditions>\
<weather-conditions>\
<value coverage=\"areas\" intensity=\"none\" weather-type=\"fog\" qualifier=\"none\">\
<visibility xsi:nil=\"true\"/>\
</value>\
</weather-conditions>\
</data>")
我正在尝试使用以下代码提取所有'weather-type'属性:
var count = 0
var test_weather = new Array()
$(xmlDoc).find('weather').each(function(){
$(this).find('weather-conditions').each(function(){
$(this).find('value').each(function(){
test_weather[count] = $(this).attr('weather-type')
count=count+1
})
})
})
但是这只能找到第一个天气类型值,我无法找出原因!对于我做错了什么或者如何改进我的代码的建议,我们将不胜感激!
答案 0 :(得分:1)
您的XML无效。您无法在不声明命名空间的情况下使用命名空间。
因此,jQuery不会解析超过第一个xsi:nil
属性的任何内容(这就是为什么您只找到第一个天气类型值)。您还错过了结束</weather>
代码。
如果声明命名空间,它应该按预期工作。
在这种情况下:
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
哪个会转换为:
var xmlDoc = $.parseXML("<dwml xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.0\">\
<data>\
<!-- ... -->
</data>\
</dwml>");
对我做错了什么的建议,或者有关如何改进我的代码的建议
您可以通过删除嵌套的.each()
方法来改进代码。您可以简化所有内容并使用.map()
method将weather-type
属性映射到test_weather
数组:
var test_weather = $('weather weather-conditions value', xmlDoc).map(function () {
return $(this).attr('weather-type');
}).get();
带有工作代码的代码段:
var xmlDoc = $.parseXML("<dwml xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.0\">\
<data>\
<weather time-layout=\"k-p3h-n40-2\">\
<name>Weather Type, Coverage, and Intensity</name>\
<weather-conditions/>\
<weather-conditions/>\
<weather-conditions/>\
<weather-conditions>\
<value coverage=\"areas\" intensity=\"none\" weather-type=\"sun\" qualifier=\"none\">\
<visibility xsi:nil=\"true\"/>\
</value>\
</weather-conditions>\
<weather-conditions>\
<value coverage=\"areas\" intensity=\"none\" weather-type=\"rain\" qualifier=\"none\">\
<visibility xsi:nil=\"true\"/>\
</value>\
</weather-conditions>\
<weather-conditions>\
<value coverage=\"areas\" intensity=\"none\" weather-type=\"fog\" qualifier=\"none\">\
<visibility xsi:nil=\"true\"/>\
</value>\
</weather-conditions>\
</weather>\
</data>\
</dwml>");
var test_weather = $('weather weather-conditions value', xmlDoc).map(function() {
return $(this).attr('weather-type');
}).get();
console.log(test_weather);
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;