E4X添加CDATA内容

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中不起作用,我觉得这种方法无论如何都会以某种方式折旧.

谁有优雅的解决方案呢?

bac*_*dos 7

这个怎么样:

var xml:XML = <doc><{nodeName}>{nodeValue}</{nodeName}></doc>
trace(xml.toXMLString());
Run Code Online (Sandbox Code Playgroud)

输出:

<doc>
  <tag>&lt;non-escaped-content&gt;</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...


更新: 我不明白你的观点

"&lt;" 与a非常不同 "<"

这就是整个事情的意义 ......:D ... "<"将在解析过程中被解释,而"&lt;"刚刚被重新转换为"<",所以在解析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


tau*_*dep 7

上面的cdata函数需要如下所示,注意最后一个">"在代码中被转义.否则会出现编译错误.

private function cdata(data:String):XML
{
    return new XML("<![CDATA[" + data + "]]\>");                
}
Run Code Online (Sandbox Code Playgroud)