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()是我一直在寻找的东西。