You may have noticed that in ExtJS 3.4 that you can’t use namespaces in your Ext.dataXmlReader.
So a xml reader defined like the example below does not work with the following xml:
1 2 3 4 5 6 7 | var Employee = Ext.data.Record.create([ {name: 'name', mapping: 'gml:name'}, {name: 'gml:occupation'} ]); var myReader = new Ext.data.XmlReader({ record: "gml|row" // The repeated element with gml namespace (gml:row) }, Employee); |
The above should consume an xml file defined like so:
1 2 3 4 5 6 7 8 9 10 11 | <?xml version="1.0" encoding="UTF-8"?> <dataset> <gml:row> <gml:name>Bill</gml:name> <gml:occupation>Gardener</gml:occupation> </gml:row> <gml:row> <gml:name>Ben</gml:name> <gml:occupation>Horticulturalist</gml:occupation> </gml:row> </dataset> |
But it doesn’t…
That is because ExtJS 3.4 DomQuery does not support namespaces. They fixed this problem in 4 but those of you still using the 3.4 framework might find my hotfix useful. If just interested in using the files themselves I have attached them at the bottom of this post. Here are the changes I made:
Changed:
1 2 3 | // tagTokenRe = /^(#)?([\w\-\*]+)/, // Removed tagTokenRe = /^(#)?([\w\-\*\|\\]+)/, // Added: allows vertical bars to be included supportsColonNsSeparator, // Added |
Then Changed:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | //while(!(modeMatch = path.match(modeRe))){ // var matched = false; // for(var j = 0; j < matchersLn; j++){ // var t = matchers[j]; // var m = path.match(t.re); // if(m){ // fn[fn.length] = t.select.replace(tplRe, function(x, i){ //return m[i]; //}); // path = path.replace(m[0], ""); // matched = true; // break; // } // } // if(!matched){ // throw 'Error parsing selector, parsing failed at "' + path + '"'; // } //} //if(modeMatch[1]){ // fn[fn.length] = 'mode="'+modeMatch[1].replace(trimRe, "")+'";'; // path = path.replace(modeMatch[1], ""); //} while (!(modeMatch = path.match(modeRe))) { var matched = false; for (var j = 0; j < matchersLn; j++) { var t = matchers[j]; var m = path.match(t.re); if (m) { fn[fn.length] = t.select.replace(tplRe, function (x, i) { return m[i]; }); path = path.replace(m[0], ""); matched = true; break; } } if (!matched) { throw 'Error parsing selector, parsing failed at "' + path + '"'; } } if (modeMatch[1]) { fn[fn.length] = 'mode="' + modeMatch[1].replace(trimRe, "") + '";'; path = path.replace(modeMatch[1], ""); } |