E4X:分配给根节点

时间:2008-09-15 10:12:05

标签: javascript flex air e4x

我在这里使用Adobe 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对象。

3 个答案:

答案 0 :(得分:5)

您似乎混淆了它们包含的值的变量。作业

node = textInput.text;

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

node.setChildren(textInput.text)

答案 1 :(得分:1)

啊,谢谢你Theo - 我确实觉得我很困惑。我认为困难的根源来自于我能够分配的事实

textInput.text = node; 

我现在猜测的只是调用XML.toString()来转换XML-&gt; String。我正在寻找setChildren()。

答案 2 :(得分:0)

如果您尝试更改文档的根元素,则实际上并不需要 - 只丢弃现有文档并替换它。或者,只需将元素包装在一个更合适的根元素中(不管怎样你都不应该编辑根节点)并且你将被设置。

当然,这不能回答你的问题。有一个丑陋的JS黑客可以做你想要的,但要记住,它可能比做上述要慢得多。无论如何,这是:

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评论。