题
我在这里使用 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 对象。
解决方案
看来您将变量与它们包含的值混淆了。分配
node = textInput.text;
改变值 多变的 node
指向,它不会改变任何对象 node
目前指向。为了做你想做的事,你可以使用 setChildren
的方法 XML
班级:
node.setChildren(textInput.text)
其他提示
啊,谢谢西奥 - 确实,我似乎很困惑。我认为混乱的根源在于我能够分配
textInput.text = node;
我现在猜测只是隐式调用 XML.toString() 来转换 XML->String。setChildren() 就是我一直在寻找的。
如果您尝试更改文档的根元素,则实际上并不需要 - 只需丢弃现有文档并替换它即可。或者,只需将您的元素包装在更合适的根元素中(无论如何您都不应该编辑根节点),然后就可以了。
当然,这并不能回答你的问题。有一个丑陋的 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 注释。
不隶属于 StackOverflow