我在这里使用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对象。
答案 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评论。