google 地图上的 xml 标记显示问题

问题描述 投票:0回答:1

我正在尝试将 SQL 数据库表中的多个标记显示到谷歌地图。我已将数据转换为 XML 格式,准备迭代为地图上的多个标记,但这就是我收到问题的地方。

我已经成功做到过一次,但是当我尝试在地图上添加另一个标记表时,我遇到了问题。并不是两套相似的代码是一样的,只是这段代码有地方错了,我在任何地方都看不到它。

您在下面看到的是 2 个用于迭代并在地图上标记它们的函数。

以下功能有效:

downloadUrl("php/setMarkers.php");

但以下情况则不然:

downloadUrl("php/sethospMarkers.php");

两个 XML 文档都被调用,响应在 google 控制台中显示得很好,并且完全相同,因此没有区别。即使我从应用程序中删除“setMarkers”函数,我也无法让这个“hospmarkers”函数工作。这个功能有什么问题吗?

Chrome 显示的与此问题相关的错误之一是:

未捕获类型错误:无法读取 null 的属性“documentElement”

用于以下通话

var markers = xml.documentElement.getElementsByTagName("marker");

在医院职能

 function initialize() {
        var bournemouth = new google.maps.LatLng(50.86244, -1.24778);
        var myOptions = {
            center: bournemouth,
            zoom: 10,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        
        var infoWindow = new google.maps.InfoWindow; 
        downloadUrl("php/setMarkers.php", function(data) {
          var xml = data.responseXML;
          var markers = xml.documentElement.getElementsByTagName("marker");
          for (var i = 0; i < markers.length; i++) {
          var name = markers[i].getAttribute("name");
          var acronym = markers[i].getAttribute("acronym");
          var point = new google.maps.LatLng(
            parseFloat(markers[i].getAttribute("lat")),
            parseFloat(markers[i].getAttribute("lng")));
          var html = "<b>" + name + "</b> <br/>" + acronym;
          var marker = new google.maps.Marker({
          map: map,
          position: point,
          icon: "img/bus.png"
        });
        bindInfoWindow(marker, map, infoWindow, html);
      }
    });
        
        downloadUrl("php/sethospMarkers.php", function(data) {
          var xml = data.responseXML;
          var markers = xml.documentElement.getElementsByTagName("marker");
          for (var i = 0; i < markers.length; i++) {
          var point = new google.maps.LatLng(
            parseFloat(markers[i].getAttribute("lat")),
            parseFloat(markers[i].getAttribute("lng")));
          var name = markers[i].getAttribute("name");
          var phone = markers[i].getAttribute("phone");
          var html = "<b>" + name + "</b> <br/>" + phone;
          var marker = new google.maps.Marker({
          map: map,
          position: point,
          icon: "img/hospital-building.png"
        });
        bindInfoWindow(marker, map, infoWindow, html);
      }
    });
           function bindInfoWindow(marker, map, infoWindow, html) {
      google.maps.event.addListener(marker, 'click', function() {
        infoWindow.setContent(html);
        infoWindow.open(map, marker);
      });
    }
    function downloadUrl(url,callback) {
         var request = window.ActiveXObject ?
             new ActiveXObject('Microsoft.XMLHTTP') :
             new XMLHttpRequest;

         request.onreadystatechange = function() {
           if (request.readyState == 4) {
             request.onreadystatechange = doNothing;
             callback(request, request.status);
           }
         };

         request.open('GET', url, true);
         request.send(null);
        }
 
    function doNothing() {}
        

下面的脚本是我用来准备数据的 xml 转换器。这是用于医院标记的。

   <?php
require("sql_dbinfo.php");

function parseToXML($htmlStr)
{
$xmlStr=str_replace('<','&lt;',$htmlStr);
$xmlStr=str_replace('>','&gt;',$xmlStr);
$xmlStr=str_replace('"','&quot;',$xmlStr);
$xmlStr=str_replace("'",'&#39;',$xmlStr);
$xmlStr=str_replace("&",'&amp;',$xmlStr);
return $xmlStr;
}

// Opens a connection to a MySQL server
$connection=mysqli_connect ('localhost', $username, $password);
if (!$connection) {
  die('Not connected : ' . mysql_error($connection));
}

// Set the active MySQL database
$db_selected = mysqli_select_db($connection, $database);
if (!$db_selected) {
  die ('Can\'t use db : ' . mysqli_error($connection));
}

// Select all the rows in the markers table
$query = "SELECT * FROM hospmarkers WHERE 1";
$result = mysqli_query($connection, $query);
if (!$result) {
  die('Invalid query: ' . mysqli_error($connection));
}

header("Content-type: text/xml");

// Start XML file, echo parent node
echo '<markers>';

// Iterate through the rows, printing XML nodes for each
while ($row = @mysqli_fetch_assoc($result)){
  // ADD TO XML DOCUMENT NODE
  echo '<marker ';
  echo 'lat="' . $row['lat'] . '" ';
  echo 'lng="' . $row['lng'] . '" ';
  echo 'name="' . $row['name'] . '" ';
  echo 'phone="' . $row['phone'] . '" ';
  echo '/>';
}

// End XML file
echo '</markers>';

?>`

sethopmarkers 响应如下。

"<markers><marker lat="53.853" lng="-0.411" name="East Riding Community Hospital" phone="01482 886600" /><marker lat="50.807" lng="-0.500" name="Zachary Merton Community Hospital " phone="01903 858100" /><marker lat="51.140" lng="-0.486" name="Musculoskeletal physiotherapy service - Cranleigh Village Hospital" phone="01483 782400" /><marker lat="51.380" lng="-0.406" name="Walton Community Hospital" phone="01932 414205" /><marker lat="51.315" lng="-0.556" name="Woking Community Hospital (Virgin Care)" phone="01483 715911" />

我是不是做了什么蠢事?或者我有语法问题?

php xml google-maps web google-maps-markers
1个回答
0
投票

正如 Molle 博士建议的那样。

姓名和电话属性必须使用函数

parseToXML

  echo 'name="' . parseToXML($row['name']) . '" ';
  echo 'phone="' . parseToXML($row['phone']) . '" ';

如上图。

谢谢莫勒。

© www.soinside.com 2019 - 2024. All rights reserved.