Index: tests/Format/test_KML.html
===================================================================
--- tests/Format/test_KML.html	(revision 4757)
+++ tests/Format/test_KML.html	(working copy)
@@ -28,7 +28,7 @@
              "read geometry collection");
     }
 
-    function test_Format_KML_readCdataAttributes(t) {
+    function test_Format_KML_readCdataAttributes_20(t) {
         t.plan(2);
         var cdata = '<kml xmlns="http://earth.google.com/kml/2.0"><Document><Placemark><name><![CDATA[Pezinok]]></name><description><![CDATA[Full of text.]]></description><styleUrl>#rel1.0</styleUrl><Point> <coordinates>17.266666, 48.283333</coordinates></Point></Placemark></Document></kml>';
         var features = (new OpenLayers.Format.KML()).read(cdata);
@@ -37,6 +37,15 @@
         
     }
     
+    function test_Format_KML_readCdataAttributes_21(t) {
+        t.plan(2);
+        var cdata = '<kml xmlns="http://earth.google.com/kml/2.1"><Document><Placemark><name><![CDATA[Pezinok]]></name><description><![CDATA[Full of text.]]></description><styleUrl>#rel1.0</styleUrl><Point> <coordinates>17.266666, 48.283333</coordinates></Point></Placemark></Document></kml>';
+        var features = (new OpenLayers.Format.KML()).read(cdata);
+        t.eq(features[0].attributes.description, "Full of text.", "Description attribute in cdata read correctly");
+        t.eq(features[0].attributes.name, "Pezinok", "title attribute in cdata read correctly");
+        
+    }
+    
     function test_Format_KML_write(t) {
         // make sure id, name, and description are preserved
         t.plan(1);
Index: lib/OpenLayers/Format/KML.js
===================================================================
--- lib/OpenLayers/Format/KML.js	(revision 4757)
+++ lib/OpenLayers/Format/KML.js	(working copy)
@@ -48,6 +48,13 @@
      * {Boolean} Extract attributes from KML.  Default is true.
      */
     extractAttributes: true,
+    
+    /**
+     * Property: internalns
+     * {String} KML Namespace to use -- defaults to the namespace of the
+     *     Placemark node being parsed, but falls back to kmlns. 
+     */
+    internalns: null,
 
     /**
      * Constructor: OpenLayers.Format.KML
@@ -83,7 +90,7 @@
             data = OpenLayers.Format.XML.prototype.read.apply(this, [data]);
         }
         var featureNodes = this.getElementsByTagNameNS(data,
-                                                       this.kmlns,
+                                                       '*',
                                                        "Placemark");
         var numFeatures = featureNodes.length;
         var features = new Array(numFeatures);
@@ -116,7 +123,10 @@
         var type, nodeList, geometry, parser;
         for(var i=0; i<order.length; ++i) {
             type = order[i];
-            nodeList = this.getElementsByTagNameNS(node, this.kmlns, type);
+            this.internalns = node.namespaceURI ? 
+                    node.namespaceURI : this.kmlns;
+            nodeList = this.getElementsByTagNameNS(node, 
+                                                   this.internalns, type);
             if(nodeList.length > 0) {
                 // only deal with first geometry of this type
                 var parser = this.parseGeometry[type.toLowerCase()];
@@ -165,7 +175,7 @@
          * {<OpenLayers.Geometry.Point>} A point geometry.
          */
         point: function(node) {
-            var nodeList = this.getElementsByTagNameNS(node, this.kmlns,
+            var nodeList = this.getElementsByTagNameNS(node, this.internalns,
                                                        "coordinates");
             var coords = [];
             if(nodeList.length > 0) {
@@ -200,7 +210,7 @@
          * {<OpenLayers.Geometry.LineString>} A linestring geometry.
          */
         linestring: function(node, ring) {
-            var nodeList = this.getElementsByTagNameNS(node, this.kmlns,
+            var nodeList = this.getElementsByTagNameNS(node, this.internalns,
                                                        "coordinates");
             var line = null;
             if(nodeList.length > 0) {
@@ -254,7 +264,7 @@
          * {<OpenLayers.Geometry.Polygon>} A polygon geometry.
          */
         polygon: function(node) {
-            var nodeList = this.getElementsByTagNameNS(node, this.kmlns,
+            var nodeList = this.getElementsByTagNameNS(node, this.internalns,
                                                        "LinearRing");
             var numRings = nodeList.length;
             var components = new Array(numRings);
