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], "");
} |
Hotfix:
ext-all-debug-namespaces.js
ext-all-namespaces.js