You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用jQuery each循环展示XML全量数据?当前仅显示单条记录

解决jQuery each循环展示XML全部数据的问题

嘿,我来帮你搞定这个问题!你现在只能显示单条记录,核心原因是你在循环里没有针对当前的<time>节点获取对应数据,而是每次都从整个XML文档中全局查找,导致每次都覆盖成第一条的数据,而且现有的HTML结构是单个容器,无法承载多条记录。下面是具体的修复方案:

问题分析

你的原代码里,在$(xml).find('forecast time').each()循环中,使用xml.find("name")、xml.find("time").attr("day")这类写法,都是从整个XML文档中查找第一个匹配的元素,所以不管循环多少次,都只会拿到第一条记录的数据,并且每次赋值都会覆盖之前的内容。

修复步骤

1. 调整HTML结构

首先把原来的单个展示标签改成一个用来承载所有记录的容器,我们可以用一个<div>来包裹每条天气预报的内容,比如:

<div id="weather-container"></div>

这样我们可以动态生成每条记录的HTML,然后追加到这个容器里。

2. 修改jQuery代码

在循环中,我们要使用$(this)来指代当前的<time>节点,然后从这个节点内部查找对应的子元素(比如temperature、wind等),同时获取城市名称这类全局信息只需要获取一次即可,不需要放在循环里。

修改后的jQuery代码如下:

$(document).ready(function(e) {
  $("#Button").on('click', function(){
    loading(true);
    $.ajax({
      type:"GET",
      url: url,
      dataType:'text',
      success: function(data){
        var xmlDoc = $.parseXML(data);
        var xml = $(xmlDoc);
        // 获取全局的城市名称,只需要一次
        var cityName = xml.find("name").text();
        var countryName = xml.find("country").text();
        // 清空容器,避免多次点击重复添加
        $("#weather-container").empty();
        
        // 遍历每个time节点
        $(xml).find('forecast time').each(function(){
          var $currentTime = $(this);
          // 获取当前time节点的属性和子元素数据
          var date = $currentTime.attr("day");
          var minTemp = $currentTime.find("temperature").attr("min") + "&deg;C";
          var maxTemp = $currentTime.find("temperature").attr("max") + "&deg;C";
          var rain = $currentTime.find("precipitation").attr("value") || "0mm";
          var wind = $currentTime.find("windSpeed").attr("mps") + " mps";
          var humidity = $currentTime.find("humidity").attr("value") + "%";
          var cloudDesc = $currentTime.find("clouds").attr("description");

          // 动态生成单条记录的HTML
          var weatherItem = `
            <div class="weather-item">
              <h3>${cityName}, ${countryName}</h3>
              <p><strong>Date:</strong> ${date}</p>
              <p><strong>Rain:</strong> ${rain}</p>
              <p><strong>Wind:</strong> ${wind}</p>
              <p><strong>Temp Range:</strong> ${minTemp} - ${maxTemp}</p>
              <p><strong>Humidity:</strong> ${humidity}</p>
              <p><strong>Cloud:</strong> ${cloudDesc}</p>
              <hr>
            </div>
          `;
          // 追加到容器中
          $("#weather-container").append(weatherItem);
        });
        loading(false);
      },
      error: function(){
        loading(false);
        alert("Failed to load weather data!");
      }
    });
  });
});

代码解释

  • 全局信息只获取一次:城市名称、国家名称这类整个XML中只有一次的内容,我们在循环外面就获取好,避免重复查找。
  • 使用$(this)指代当前节点:在each循环中,this就是当前的<time>元素,用$(this)包装后,就可以在这个节点内部查找对应的子元素,确保拿到的是当前记录的数据。
  • 动态生成HTML:通过模板字符串创建每条记录的DOM结构,然后追加到容器中,这样每条记录都会被单独展示,不会被覆盖。
  • 清空容器:在每次请求成功后先清空容器,避免多次点击按钮导致重复添加记录。

可选:添加基础样式

为了让展示更美观,可以加一点CSS样式:

.weather-item {
  padding: 15px;
  margin: 10px 0;
  border: 1px solid #eee;
  border-radius: 8px;
}
.weather-item hr {
  border: none;
  border-top: 1px solid #eee;
  margin: 10px 0;
}

内容的提问来源于stack exchange,提问作者Julia Alison

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:22:18