我在这里使用 Adob​​e 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 注释。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top