【问题标题】:E4X Add CDATA contentE4X 添加 CDATA 内容
【发布时间】:2010-11-17 09:21:24
【问题描述】:

基本上我需要使用变量定义节点名称及其 CDATA 内容。

var nodeName:String = "tag";
var nodeValue:String = "<non-escaped-content>";

我天真地认为这会起作用:

var xml:XML = <doc><{nodeName}><![CDATA[{nodeValue}]]></{nodeName}>

输出:

<doc><tag><![CDATA[{nodeValue}]]></tag></doc>

在为 FP9 设计的以前版本的脚本中,我使用以下方法绕过了这个问题:

new XMLNode( XMLNodeType.XMLNodeType.CDATA_NODE, nodeValue ); // ...

但这似乎在 FP10 中不起作用,而且我觉得该方法无论如何都被贬低了。

任何人都可以优雅地解决这个问题?

【问题讨论】:

    标签: actionscript-3 e4x cdata


    【解决方案1】:

    这是我不使用函数的解决方案:

    var nodeName:String = "tag";
    var nodeValue:String = "<non-escaped-content>";
    var xml:XML = <doc><{nodeName}>{new XML("<![CDATA[" + nodeValue + "]]>")}</{nodeName}></doc>;
    

    如果您需要替换现有节点内容并保留节点属性,您可以使用:

    var newNodeValue:String = "<non-escaped-content>";
    var xml:XML = <doc><tag attribute="true">This is node content</tag></doc>;
    
    xml.tag[0].setChildren(new XMLList());
    xml.tag[0].appendChild(new XML("<![CDATA[" + newNodeValue + "]]>"));
    

    【讨论】:

      【解决方案2】:

      这是另一个解决方案

      public static function getCDATANode(data:String, tagName:String):void
      {
              var node:XML  = new XML(  "<" + tagName + "/>" );
              var cdata:XML = new XML("<![CDATA[" + data + " ]]>");
              node.appendChild(cdata);
      
              trace("getCDATANode: ", node.toXMLString() );
      }
      

      【讨论】:

        【解决方案3】:
        private function cdata(data:String, nodeName:String):XML{
            return new XML( "<"+nodeName+"><![CDATA[" + data + "]]\></"+nodeName+">");
        }
        

        工作正常:)

        【讨论】:

          【解决方案4】:

          谢谢,cdata 功能非常有用。我刚写了一个新的。

          function newNode(nodeName:String,nodeValue:String):XML{
              return new XML(<{nodeName}>{cdata(nodeValue)}</{nodeName}>);
          }
          

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

            • 此方法适用于所有情况,但如果我的数据是 ']]>' 我会收到错误消息“根元素之后的文档中的标记必须格式正确。”在转换为 xml 时。有没有其他方法可以解决?
            【解决方案6】:

            这个怎么样:

            var xml:XML = <doc><{nodeName}>{nodeValue}</{nodeName}></doc>
            trace(xml.toXMLString());
            

            输出:

            <doc>
              <tag>&lt;non-escaped-content&gt;</tag>
            </doc>
            

            我承认,这不是CDATA,但我看不出有什么问题...解析需要多一点时间,但是OTOH,正确转义比CDATA 更强大...

            带有XMLNode 的版本使用flash.xml 包,这是为了向后兼容AS2 ...甚至没有注意到,它在FP10下消失了...但是,您可以使用它

            var x:XML = new XML("<![CDATA[" + nodeValue + "]]>");
            

            作为替代,然后像使用 flash.xml 一样使用 appendChild ...

            或者你可以使用 e4x 风格,如果你将它包装在一个函数中

            function cdata(data:String):XML {
                return = new XML("<![CDATA[" + data + "]]>");
            }
            

            然后

            var xml:XML = <doc><{nodeName}>{cdata(nodeValue)}</{nodeName}></doc>
            

            但就我个人而言,我认为基于文本且相对较短的字符串应该被转义,而不是包裹在CDATA ...


            更新: 我不明白你的意思

            "&amp;lt;""&lt;" 非常不同

            这就是全部内容 ... :D ... "&lt;" 将在解析期间被解释,而 "&amp;lt;" 只是重新转换为 "&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 + "]]>");
                    }
                }
            }
            

            在使用 flex sdk 4 编译的 flash player 10 上非常适合我……手头没有 flash IDE,但是对于纯 ActionScript 结果几乎肯定是相同的,所以它应该可以工作(你如果您愿意,可以将其用作您的文档类,或者只是实例化它)...

            顺便说一句。第一个跟踪显示,第二个示例有效,这也很明显,因为 new XML(&lt;String&gt;) 使用本机 XML 解析器从给定字符串创建 XML ...

            这是上面生成的:

            <![CDATA[test]]>
            <doc>
              <tag><![CDATA[<non-escaped-content>]]></tag>
            </doc>
            

            对我来说效果很好...... :)


            问候

            back2dos

            【讨论】:

            • 嘿,谢谢。我想要 CDATA 的原因是该方法用于记录包括 XML 在内的字符串,其中“<”当然与“
            • 我没有让 cdata 帮助函数在 Flex SDK 3.X 中编译任何东西。
            • 我收到 mxml 编译器错误:"Parse error at '\");\n\t\t}\n\n\n\t\....return new XML(" ");" 我在下面添加了cdata函数的可编译实现。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-05-25
            • 2014-12-18
            • 2010-09-16
            • 2012-08-30
            • 1970-01-01
            • 2011-01-17
            • 1970-01-01
            相关资源
            最近更新 更多