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>

次のJavascriptを使用して、GoogleMapAPIを使用してこれらを解析およびマッピングしています。

 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

何が起こっているのかというと、テキストノードの子を取得しようとしているということです。Chromeには要素の<name>子の前にテキストノードがありますが<markers>、IEにはありません。

ドキュメント要素の各子が<NewDataSet>テキストノードであるかどうかをテストしているため、そのレベルでの問題は回避されますが、実際には非IEブラウザーのテキストノードである場合、各<markers>要素の最初の子が要素であると想定しています。 <name>

getElementsByTagNameこの問題を回避するには、DOMノードを使用することをお勧めします。改善されたバージョンは次のとおりです。

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 に答える