2013-01-15 16 views
5

Ich habe jede Antwort durchgesehen, die ich hier finden kann und kann das nicht lösen. Ich bin mir ziemlich sicher, dass ich nichts Offensichtliches verpasst habe.responseText funktioniert, aber responseXML ist immer null

Ich versuche, Kartenmarkierungen basierend auf Lat Longs zu laden. Das Problem ist, wenn ich versuche, die AJAX Antwort als responseXML ist immer Null, wenn ich responseText es funktioniert gut, aber offensichtlich der nächste Schritt funktioniert nicht.

Dies ist die PHP, die das XML erzeugt:

<?php 
header('Content-type: text/xml'); 
?>  
<?xml version="1.0" encoding="ISO-8859-1"?> 
<properties> 
    <![CDATA[ 
<?php 
if ($body != null): 
     foreach ($body as $property): ?> 
     <property> 
      <lat><?php echo $property -> lat; ?></lat> 
      <long><?php echo $property -> long; ?></long> 
      <name><?php echo $property -> property_name; ?></name> 
      </property> 
<?php endforeach; 
endif; ?> 
    ]]> 
</properties> 

ich in Fiddler sehen kann, dass die Anfrage

GET /letsgo/index.php/hotmaps/get_properties_ajax/22.270888501350186/22.288560098193066/114.13720860290528/114.19827713775635 HTTP/1.1

Entity Content-type: text/xml

ok gemacht Obwohl, wenn ich dies in Fiedler in XML-Ansicht anzeigen erscheint es leer zu sein,

hier ist die rohe Reaktion

HTTP/1.1 200 OK 
Date: Tue, 15 Jan 2013 11:04:27 GMT 
Server: Apache/2.4.2 (Win32) PHP/5.4.4 
X-Powered-By: PHP/5.4.4 
Expires: Thu, 19 Nov 1981 08:52:00 GMT 
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 
Pragma: no-cache 
Content-Length: 310 
Keep-Alive: timeout=5, max=100 
Connection: Keep-Alive 
Content-Type: text/xml 



<?xml version="1.0" encoding="ISO-8859-1"?> 
<properties> 
    <![CDATA[ 
     <property> 
      <lat>22.2776</lat> 
      <long>114.173</long> 
      <name>Kaxo Tower test</name> 
      </property> 
     <property> 
      <lat>22.2803</lat> 
      <long>114.16</long> 
      <name>Kuno Tower</name> 
      </property> 
    ]]> 
</properties> 

Hier wird die Marker-Funktion erstellen, ist, dass jedes Mal, wenn die Karte

// make the ajax request 
function loadXMLDoc(downUrl){ 
    var xmlhttp; 
    if (window.XMLHttpRequest) { 
     // code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
     } 
    else {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    xmlhttp.onreadystatechange=function() { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 

      //var propertiesXml = xmlhttp.responseText; // WORKS FINE!! 
      var propertiesXml = xmlhttp.responseXML; // ALWAYS null 
      //alert(propertiesXml);  
      var propertiesRows = propertiesXml.getElementsByTagName("property"); 

      for (var i = 0; i < propertiesRows.length; i++) {   
      var propertiesRow = propertiesRows[i]; 
      var xmlLat = propertiesRow.getElementsByTagName("lat")[0]; 
      var xmlLong = propertiesRow.getElementsByTagName("long")[0]; 
      var propertyLatLong = new google.maps.LatLng(parseFloat(xmlLat.firstChild.data),parseFloat(xmlLat.firstChild.data));    
      // create each marker 
      createMarker(propertyLatLong); 
      } 

      } 
     } 
    xmlhttp.open("GET", downUrl, false); // false or true? makes no difference 
    xmlhttp.setRequestHeader("Content-type", "text/xml"); 
    xmlhttp.send(); 
} 

und das ist der Fehler, den ich getElementsByTagName zum Einspeisen mit null erhalten bewegt wird genannt wird, sagt Chrome Konsole

Uncaught TypeError: Cannot call method 'getElementsByTagName' of null

Dies ist läuft auf meinem lokalen Apache

Irgendwelche Vorschläge?

/** UPDATE - ARBEITSCODE **/

<!DOCTYPE html> 
<html> 
    <head> 
    <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> 
    <style type="text/css"> 
     html { height: 100% } 
     body { height: 100%; margin: 0; padding: 0 } 
     #map_canvas { height: 100% } 
    </style> 
    <script type="text/javascript" src="https://maps.googleapis.com/maps/api/js?key=APIKEYHERE&sensor=false"> 
    </script> 

    <script type="text/javascript"> 

     // initialise map 
     function initialize() { 

     // set starting latlong 
     var myLatlng = new google.maps.LatLng(22.2776, 114.173); 

     // set initial map options   
     var mapOptions = { 
     center: myLatlng, 
     zoom: 13, 
     mapTypeId: google.maps.MapTypeId.ROADMAP 
     }; 

     // create the map      
     var map = new google.maps.Map(document.getElementById("map_canvas"), mapOptions); 

     // listen for changes in map bounds - after map has stopped moving!!  
     google.maps.event.addListener(map,'idle', function() {  
     loadByBounds(map);   
     });     
     } 

     // if the bounds have changed 
     function loadByBounds(map) { 

     var bounds = map.getBounds();  
     var swPoint = bounds.getSouthWest(); 
     var nePoint = bounds.getNorthEast(); 

     // specific co ordinates 
     var swLat = swPoint.lat(); 
     var swLng = swPoint.lng(); 
     var neLat = nePoint.lat(); 
     var neLng = nePoint.lng();    

     var downUrl = "<?php echo site_url('hotmaps/get_properties_ajax'); ?>/"+swLat+"/"+neLat+"/"+swLng+"/"+neLng; 

     // load the 
     loadXMLDoc(downUrl, map); 

     // clear icons outside of bounding box 

     //.... 


     } 

     // make the ajax request 
     function loadXMLDoc(downUrl, map){ 
      var xmlhttp; 
      if (window.XMLHttpRequest) { 
       // code for IE7+, Firefox, Chrome, Opera, Safari 
       xmlhttp=new XMLHttpRequest(); 
       } 
      else {// code for IE6, IE5 
       xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
       } 
      xmlhttp.onreadystatechange=function() { 
       if (xmlhttp.readyState==4 && xmlhttp.status==200) 
       { 

        var propertiesXml = xmlhttp.responseText; // WORKS FINE!! 

        // remove whitespaces from start and end (.trim() doesnt work) 
        propertiesXml = propertiesXml.replace(/^\s+|\s+$/g,'');     

        // manually parse to XML DOM object 
        var parser = new DOMParser();     
        var xmlDoc;     
         try { 
          xmlDoc = parser.parseFromString (propertiesXml, "text/xml"); 
         } catch (e) { 
          alert ("XML parsing error."); 
          return false; 
         }; 

        //console.log(xmlDoc); 

        // get each property 
        var propertiesRows = xmlDoc.getElementsByTagName("property"); 

        //alert(console.log(propertiesRows)); 
        for (var i = 0; i < propertiesRows.length; i++) { 

         var propertiesRow = propertiesRows[i]; 
         var xmlLat = propertiesRow.getElementsByTagName("lat")[0]; 
         var xmlLong = propertiesRow.getElementsByTagName("long")[0]; 
         var propertyLatLong = new google.maps.LatLng(parseFloat(xmlLat.firstChild.data),parseFloat(xmlLong.firstChild.data));   
         // create each marker 
         createMarker(propertyLatLong, map); 
        } 
       } 
      } 
      xmlhttp.open("GET", downUrl, false); 
      xmlhttp.setRequestHeader("Content-type", "text/xml"); 
      xmlhttp.send(); 
     } 

     // create new markers 
     function createMarker(propertyLatLong, map){    
      var dynamicMarker = new google.maps.Marker({ 

       map:map, 
       draggable:false, 
       position: propertyLatLong 
      }); 
      debugger;   
     }  
    </script> 
    </head> 
    <body onload="initialize()">  
    <div id="map_canvas" style="width:100%; height:100%"></div> 
    </body> 
</html> 

Antwort

7

können Sie versuchen, XML-Parsing selbst:

var parser = new DOMParser(); 
var xmlDoc = parser.parseFromString(xmlhttp.responseText, "application/xml"); 

Like this.

+0

Ich bin die Route, die Sie vorgeschlagen haben, gegangen und es scheint zu funktionieren, obwohl jetzt bekomme ich einen undefinierten var Fehler, dies kann ein separates Problem sein, würde es Ihnen etwas ausmachen, einen Blick? Vielen Dank. – dijkstra8x

+0

Können Sie genauer sein? Welche Var ist in welcher Zeile undefiniert? – povilasp

+0

 ist nicht Vollbild definiert: 104 was wäre .. } } xmlhttp.open ("GET", downUrl, false); – dijkstra8x

0

Ihre Tags befinden sich im CDATA-Bereich und werden daher vom Parser als Tag ignoriert.

+0

Ich habe die CDATA nach dem Lesen einer Antwort von somone auf einen ähnlichen Beitrag, macht es keinen Unterschied. – dijkstra8x

+0

sieh dir das an [link] http://www.w3.org/TR/REC-xml/#dt-cdsection und link geposted von Lemmy Tauer – JEY

+0

ich habe den CDATA-Bereich komplett entfernt, danke – dijkstra8x

0

Ich frage mich, warum Sie wollen, dass der Parser fast Ihre gesamte HTTP-Antwort Körper überspringen, es scheint, dass es keine Notwendigkeit gibt, es enthält nichts, das fehlinterpretiert werden könnte. Es sind sogar die Daten, die analysiert werden sollen, die Sie ohne ersichtlichen Grund in Ihrem Beispiel verstecken.

Schauen Sie hier nach einer Erklärung von CDATA: http://www.w3schools.com/xml/xml_cdata.asp

Sie könnten versuchen, die Öffnungs- und Schließ CDATA Aussage wie hier erwähnt zu kommentieren out: http://de.selfhtml.org/html/xhtml/unterschiede.htm

Darin heißt es, dass der XML-Parser UTF-8-Codierung übernimmt Standardmäßig wird das Parsen abgelehnt, wenn es nicht korrekt konfiguriert ist, und das Überschreiben des erwarteten Typs über den Antwortheader wird nicht empfohlen.

Ich bevorzuge es zu vermeiden, Öffnen und Schließen von PHP-Blöcken in Block-Anweisungen, wie Sie es getan haben, aber ich bin nicht ganz auf dem neuesten Stand mit den neuesten Kodierungskonventionen, damit ich falsch liegen kann.

+0

ok, danke! Ich finde es einfacher zu lesen, wenn es so geschrieben wird, wie ich es getan habe, wenn es viel HTML in einer Ansichtsdatei gibt, macht es auch viel einfacher, Fehler im HTML zu finden. – dijkstra8x