Ответ 1
как насчет этого:
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
...
обновление: я не понимаю вашу точку зрения.
"<"
сильно отличается от a"<"
, что все дело в...: 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-проигрывателе 10, скомпилированном с flex sdk 4... у меня нет флеш-IDE под рукой, но когда дело доходит до чистого результата ActionScript, почти наверняка то же самое, поэтому он должен работать (вы может использовать это как ваш класс документа, если вы хотите, или просто создать его экземпляр)...
кстати. первая трассировка показывает, что второй пример работает, что также совершенно очевидно, так как new XML(<String>)
использует собственный синтаксический анализатор XML
для создания XML
из данной строки...
вот что вышло выше:
<![CDATA[test]]>
<doc>
<tag><![CDATA[<non-escaped-content>]]></tag>
</doc>
работает неплохо для меня...:)
Greetz
back2dos