как насчет этого:
var xml:XML = <doc><{nodeName}>{nodeValue}</{nodeName}></doc>
trace(xml.toXMLString());
выходы:
<doc>
<tag><non-escaped-content></tag>
</doc>
Признаюсь, это не CDATA
, но я не вижу проблемы ... парсинг требует немного больше времени, но OTOH, правильное экранирование гораздо более надежное, чем CDATA
...
версия с XMLNode
использует пакет flash.xml
, который предназначен для обратной совместимости с AS2 ... даже не заметил, он пропал под FP10 ... однако, вы могли бы использовать этот
var x:XML = new XML("<![CDATA[" + nodeValue + "]]>");
в качестве замены, а затем используйте appendChild
, как если бы вы использовали flash.xml ...
в качестве альтернативы вы можете использовать его в стиле e4x, если заключите его в функцию
function cdata(data:String):XML {
return = new XML("<![CDATA[" + data + "]]>");
}
, а затем
var xml:XML = <doc><{nodeName}>{cdata(nodeValue)}</{nodeName}></doc>
но лично я считаю, что строки, как текстовые, так и относительно короткие, должны быть экранированы, а не заключены в CDATA
...
Обновление:
я не понимаю вашу точку зрения
"<"
сильно отличается от "<"
это то, о чем идет речь ...: D ... "<"
будет интерпретироваться во время синтаксического анализа, тогда как "<"
просто преобразуется в "<"
, поэтому после анализа XML , у вас будет точно та же строка, что и раньше ...
это мой код:
package {
import flash.display.MovieClip;
public class Main extends MovieClip {
public function Main():void {
var nodeName:String = "tag";
var nodeValue:String = "<non-escaped-content>";
var xml:XML = <doc><{nodeName}>{cdata(nodeValue)}</{nodeName}></doc>;
trace(cdata("test").toXMLString());
trace(xml.toXMLString());
}
private function cdata(data:String):XML {
return new XML("<![CDATA[" + data + "]]>");
}
}
}
отлично работает для меня на Flash Player 10, скомпилированном с Flex SDK 4 ... У меня нет Flash IDE под рукой, но когда дело доходит до чистого ActionScript, результаты почти наверняка совпадают, поэтому он должен работать (вы можете использовать его в качестве класса документа, если хотите, или просто создать его экземпляр) ...
кстати. первая трассировка показывает, что работает второй пример, что также вполне очевидно, поскольку new XML(<String>)
использует собственный синтаксический анализатор XML
для создания XML
из заданной строки ...
вот что генерирует вышесказанное:
<![CDATA[test]]>
<doc>
<tag><![CDATA[<non-escaped-content>]]></tag>
</doc>
работает довольно хорошо для меня ...:)
Greetz
back2dos