基本上我需要使用变量定义节点名称及其CDATA内容.
var nodeName:String = "tag"; var nodeValue:String = "";
天真我以为这会起作用:
var xml:XML =<{nodeName}>{nodeName}>
产出:
在为FP9设计的以前版本的脚本中,我使用以下方法绕过了问题:
new XMLNode( XMLNodeType.XMLNodeType.CDATA_NODE, nodeValue ); // ...
但这似乎在FP10中不起作用,我觉得这种方法无论如何都会以某种方式折旧.
谁有优雅的解决方案呢?
这个怎么样:
var xml:XML =<{nodeName}>{nodeValue}{nodeName}> trace(xml.toXMLString());
输出:
<non-escaped-content>
我承认,这不是CDATA
,但我没有看到问题...解析需要更多的时间,但OTOH,正确的逃避比CDATA
... 更强大
XMLNode
使用该flash.xml
软件包的版本,这是为了向后兼容AS2 ...甚至没有注意到,它在FP10下消失...但是,你可以使用这个
var x:XML = new XML("");
作为替代品,然后appendChild
像使用flash.xml一样使用...
或者你可以使用它e4x风格,如果你把它包装在一个函数中
function cdata(data:String):XML { return = new XML(""); }
然后
var xml:XML =<{nodeName}>{cdata(nodeValue)}{nodeName}>
但就个人而言,我认为那些基于文本和相对较短的字符串应该被转义,而不是包含在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 = ""; var xml:XML = <{nodeName}>{cdata(nodeValue)}{nodeName}> ; trace(cdata("test").toXMLString()); trace(xml.toXMLString()); } private function cdata(data:String):XML { return new XML(""); } } }
在flash player 10上完美适用于我,使用flex sdk编译4 ...手头没有flash IDE,但是当谈到纯ActionScript结果时几乎肯定是一样的,所以它应该可以工作(你可以使用它)作为你的文档类,如果你想,或只是实例化它)...
顺便说一句.第一个跟踪显示,第二个示例有效,这也很明显,因为new XML(
使用本机XML
解析器XML
从给定的字符串创建...
以下是上面生成的内容:
]]>
对我来说效果很好...... :)
格尔茨
back2dos
上面的cdata函数需要如下所示,注意最后一个">"在代码中被转义.否则会出现编译错误.
private function cdata(data:String):XML { return new XML(""); }