E4X:分配给根节点

时间:2020-03-05 18:53:13  来源:igfitidea点击:

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

解决方案

回答

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

当然,这并不能回答问题。有一个丑陋的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注释。

回答

似乎我们混淆了变量所包含的值。分配

node = textInput.text;

更改变量"节点"指向的值,它对节点当前指向的对象不做任何更改。要执行我们想做的事情,可以使用XML类的setChildren方法:

node.setChildren(textInput.text)

回答

谢谢你,西奥确实似乎在那里感到困惑。我认为混淆的根源来自我能够分配的事实

textInput.text = node;

我现在猜测只是隐式调用XML.toString()来转换XML-> String。 setChildren()是我一直在寻找的东西。