0

我有一个以下结构的 XML 文件。

<NewDataSet>
 <markers>
  <name>name text</name>
  <desc>desc text</desc>
  <Lat>57.149328033771</Lat>
  <Long>-2.12561060173764</Long>
  <cost>9985</cost>
 </markers>
</NewDataSet>

我正在使用 Google Map API 来解析和映射这些,使用以下 Javascript。

 function load() {
  if (GBrowserIsCompatible()) {
    var map = new GMap2(document.getElementById("map"));
    map.addControl(new GSmallMapControl());
    map.addControl(new GMapTypeControl());
    map.setCenter(new GLatLng(47.614495, -122.341861), 13);

    GDownloadUrl("test1.xml", function(data) {
        var xml = GXml.parse(data);
        x= xml.documentElement;
        y = xml.documentElement.childNodes;
        alert(y.length);
        for (i=0;i<y.length;i++)
        {
            if (y[i].nodeType!=3)
            {
              alert(y[i].childNodes[0].nodeName + " : " + y[i].childNodes[0].childNodes[0].nodeValue); //name
            }
        }

    });
  }
}

完整的 xml 和 html 文件都可以在这里下载:http: //domain2405544.sites.fasthosts.com/test/test1.htm http://domain2405544.sites.fasthosts.com/test/test1.xml

首先,我只是想解析这些数据。在 IE6 中工作正常(没有选择),它会正确提醒数据。但是,当我在 Chrome 中加载同一页面时,它告诉我:

Uncaught TypeError: Cannot read property 'nodeName' of undefined - line 29

我使用的是相同的文件,所以可能存在我看不到的潜在问题。有没有人知道为什么会发生这种情况?

谢谢

4

1 回答 1

8

发生的事情是您试图获取文本节点的子节点。<name>Chrome 将在元素的子元素之前有一个文本节点,<markers>而 IE 不会。

您正在测试文档元素的每个子元素<NewDataSet>是否是文本节点,从而避免了该级别的问题,但是您假设每个元素的第一个子<markers>元素是<name>元素,而实际上它是非 IE 浏览器中的文本节点.

你最好使用getElementsByTagNameDOM 节点来避免这个问题。这是一个改进的版本:

GDownloadUrl("test1.xml", function(data) {
    var xml = xhr.responseXML;
    var root = xml.documentElement;
    var markers = root.getElementsByTagName("markers"), nameEl;

    for (var i = 0, len = markers.length; i < len; ++i) {
        nameEl = markers[i].getElementsByTagName("name")[0];
        alert(nameEl.firstChild.data);
    }
});
于 2010-06-04T10:46:33.667 回答