【问题标题】:E4X : Assigning to root nodeE4X:分配给根节点
【发布时间】:2026-01-28 21:10:01
【问题描述】:

我在这里使用的是 Adob​​e Flex/Air,但据我所知,这适用于所有 JavaScript。这个问题我遇到过几次了,肯定有一个简单的解决方案!

假设我有以下 XML(使用 e4x):

var xml:XML = <root><example>foo</example></root>

我可以使用以下代码更改示例节点的内容:

xml.example = "bar";

但是,如果我有这个:

var xml:XML = <root>foo</root>

如何更改根节点的内容?

xml = "bar";

显然不起作用,因为我试图将字符串分配给 XML 对象。

【问题讨论】:

    标签: javascript apache-flex air e4x


    【解决方案1】:

    您似乎混淆了变量所包含的值。任务

    node = textInput.text;
    

    更改变量 node 指向的值,它不会更改node 当前指向的对象的任何内容。要做你想做的事,你可以使用XML 类的setChildren 方法:

    node.setChildren(textInput.text)
    

    【讨论】:

      【解决方案2】:

      啊,谢谢你 Theo - 确实我在那里很困惑。我认为混乱的根源来自我能够分配的事实

      textInput.text = node; 
      

      我现在猜测只是隐式调用 XML.toString() 来转换 XML->String。 setChildren() 是我要找的。​​p>

      【讨论】:

        【解决方案3】:

        如果您尝试更改文档的根元素,您实际上并不需要 - 只需丢弃现有文档并替换它即可。或者,只需将您的元素包装在更合适的根元素中(无论如何您都不应该编辑根节点),然后您就可以设置了。

        当然,这并不能回答您的问题。有一个丑陋的 JS hack 可以做你想做的事,但请记住,它可能比上面做的要慢得多。无论如何,这里是:

        var xml = <root>foo</root>; // </fix_syntax_highlighter>
        var parser = new DOMParser();
        var serializer = new XMLSerializer();
        
        // Parse xml as DOM document
        // Must inject "<root></root>" wrapper because  
        // E4X's toString() method doesn't give it to us
        // Not sure if this is expected behaviour.. doesn't seem so to me.
        var xmlDoc = parser.parseFromString("<root>" + 
          xml.toString() + "</root>", "text/xml");
        
        // Make the change
        xmlDoc.documentElement.firstChild.nodeValue = "CHANGED";
        
        // Serialize back to string and then to E4X XML()
        xml = new XML(serializer.serializeToString(xmlDoc));
        

        您可以忽略 fix_syntax_highlighter 注释。

        【讨论】: