/ Published in: ActionScript 3
Loading XML, specifically from 3rd party sources can sometimes prove problematic when the XML makes use of namespaces. This snippet will take an XML object and strip all namespace declarations and prefixes. This snippet leaves the input XML unchanged and returns a new XML object.
Expand |
Embed | Plain Text
function stripXMLNamespaces(xml:XML):XML { var s:String = xml.toString(); var pattern1:RegExp = /\s*xmlns[^\'\"]*=[\'\"][^\'\"]*[\'\"]/gi; s = s.replace(pattern1, ""); var pattern2:RegExp = /<[\/]{0,1}(\w+:).*?>/i; while(pattern2.test(s)) { s = s.replace(pattern2.exec(s)[1], ""); } return XML(s); }
Comments
Subscribe to comments
You need to login to post a comment.

This code won't work for XML elements containing attributes. For example:
The code snippet will handle strip the "ns" qualifier from "foo," but won't touch "attr1" or "attr2."
Hmmm...the XML example I posted didn't come through. Let me try that again:
<ns:foo ns:attr1="bar" ns:attr2="baz">
This seems to work:
function stripXMLNamespaces(xml:XML):XML { var s:String = xml.toString(); var pattern1:RegExp = /\sxmlns[^\'\"]=[\'\"][^\'\"][\'\"]/gi; s = s.replace(pattern1, ""); var pattern2:RegExp = /(<[\/]{0,1})(\w+:)(.?>)/i; while(pattern2.test(s)) { s = s.replace(pattern2, "$1$3"); } var pattern3:RegExp = /(<[\/]{0,1}.?)(\w+:)(\w+=[\'\"][^\'\"][\'\"])(.*?>)/i; while(pattern3.test(s)) { s = s.replace(pattern3, "$1$3$4"); } return XML(s); }
Or with newlines:
function stripXMLNamespaces(xml:XML):XML { var s:String = xml.toString(); var pattern1:RegExp = /\sxmlns[^\'\"]=[\'\"][^\'\"][\'\"]/gi; s = s.replace(pattern1, ""); var pattern2:RegExp = /()/i; while(pattern2.test(s)) { s = s.replace(pattern2, "$1$3"); } var pattern3:RegExp = /()/i; while(pattern3.test(s)) { s = s.replace(pattern3, "$1$3$4"); } return XML(s); }
One more try:
function stripXMLNamespaces(xml:XML):XML {
var s:String = xml.toString();
var pattern1:RegExp = /\sxmlns[^\'\"]=[\'\"][^\'\"][\'\"]/gi;
s = s.replace(pattern1, "");
var pattern2:RegExp = /()/i;
while(pattern2.test(s)) {
s = s.replace(pattern2, "$1$3");
}
var pattern3:RegExp = /()/i;
while(pattern3.test(s)) {
s = s.replace(pattern3, "$1$3$4");
}
return XML(s);
}
Closer, but you'll have to fix the indenting.