【问题标题】:read xml in javascript problem在 javascript 中读取 xml 问题
【发布时间】:2010-05-15 03:04:41
【问题描述】:

大家好,

我的代码读取 xml 有问题。我使用 ajax 读取 xml 数据并将其填充到组合框中。我的问题是它只读取第一个数据。这是我的代码

我的xml是这样的

 <info>
 <area>
        <code>1</code>
        <name>area1</name>
 </area>
  <area>
         <code>2</code>
         <name>area2</name>
  </area>
  </info>

还有我的 javascript

 if(http.readyState == 4 && http.status == 200) {
   //get select elements
   var item = document.ProblemMaintenanceForm.elements["probArea"];
   //empty combobox
   item.options.length = 0;
   //read xml data from action file
   var test = http.responseXML.getElementsByTagName("area");
   alert(test.length);
   for ( var i=0; i < test.length; i++ ){
          var tests = test[i];
          item.options[item.options.length] = new Option(tests.getElementsByTagName("name")[i].childNodes[0].nodeValue,tests.getElementsByTagName("code")[i].childNodes[0].nodeValue);


                             }


                     }

【问题讨论】:

  • 您是否在调试器中单步执行代码以验证您返回的 XML 是否符合您的预期?走过它,看看会发生什么。您可以使用 IE8 的开发人员工具或 Firefox 的 Firebug 插件来逐行跟踪执行。检查数组的值并确保为每个属性使用正确的索引。乍一看,似乎 childNodes[i] 不正确。
  • 我已经逐步完成了代码,并且 xml 与我所期望的相同
  • 如果可以的话,请使用 JSON 而不是 XML,这是一种更好的格式。

标签: javascript xml ajax


【解决方案1】:

您不必为它编制两次索引。只需将该行更改为:

item.options[item.options.length] = new Option(
    tests.getElementsByTagName("name")[0].childNodes[0].nodeValue,
    tests.getElementsByTagName("code")[0].childNodes[0].nodeValue
);

因此,为清楚起见,您的上述代码块应如下所示:

if(http.readyState == 4 && http.status == 200) {
  //get select elements
  var item = document.ProblemMaintenanceForm.elements["probArea"];
  //empty combobox
  item.options.length = 0;
  //read xml data from action file
  var test = http.responseXML.getElementsByTagName("area");
  alert(test.length);
  for ( var i=0; i < test.length; i++ ){
    var tests = test[i];
    item.options[item.options.length] = new Option(
        tests.getElementsByTagName("name")[0].childNodes[0].nodeValue,
        tests.getElementsByTagName("code")[0].childNodes[0].nodeValue
    );
  }
}

【讨论】:

    【解决方案2】:

    您需要另一个循环或固定索引,而不是在以下行中重用循环索引(例如...("name")[i]):

        item.options[item.options.length] = new Option(
            tests.getElementsByTagName("name")[i].childNodes[0].nodeValue,
            tests.getElementsByTagName("code")[i].childNodes[0].nodeValue
        );
    

    您正在使用var i 循环遍历元素节点,显然每个循环实例都会增加一个。现在,如果您解析 i &gt; 0 处的任何元素,您将无法访问 name 标记,因为不存在(至少在您的示例 xml 中)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 2016-09-25
      • 2016-11-11
      • 1970-01-01
      • 2013-09-13
      相关资源
      最近更新 更多