Самому написать - меньше получаса работы...
Ок, попробую объяснить на более простом примере, что вы пытаетесь сделать, и почему это делать не нужно таким способом...

Код:
class SomeClass {
private var __s:String = "";
function SomeClass(s:String){
_s = s;
}
public function toString():String {
if(_s.indexOf("![CData")>-1){
return escape(_s.slice(_s.indexOf("[",2)+1,_s.indexOf("]")));
} else {
return _s;
}
}
public function get _s():String {
return __s;
}
public function set _s(s:String):Void {
__s = s;
}
}

Код:
var _sc:SomeClass = new SomeClass("![CData[<H1>Header</H1>]]");
trace(_sc);
var _sc:SomeClass = new SomeClass("<H1>Header</H1>");
trace(_sc);
Итак, функция возвращает вам массив состоящий из объектов типа XMLNode, у них бывает еще и nodeType, который и указывает, каким образом нужно конвертировать экземпляр данного класса в строку. Так вот, узел типа CData конвертируется в строку именно таким способом - но это ни разу в жизни не значит, что его содержимое (nodeValue) является той строкой, которую вы видите в окне output'а! nodeValue - такое же свойство объекта, как и любое другое.
Вам, для того, чтобы воспользоваться тегом CData (иначе он вам вообще не нужен) нужно обращаться к его свойсву nodeValue, а не методу toString()/valueOf(). Иначе вы естественно получите то, что получаете =)