NOAA天气数据的Javascript XML解析 - 从子节点提取数据的问题

时间:2016-01-20 21:12:59

标签: javascript jquery xml

我喜欢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
    })
  })
})

但是这只能找到第一个天气类型值,我无法找出原因!对于我做错了什么或者如何改进我的代码的建议,我们将不胜感激!

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() methodweather-type属性映射到test_weather数组:

Working Example Here

var test_weather = $('weather weather-conditions value', xmlDoc).map(function () {
  return $(this).attr('weather-type');
}).get();

带有工作代码的代码段:

&#13;
&#13;
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;
&#13;
&#13;