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