Здесь я использую 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.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Если вы пытаетесь изменить корневой элемент документа, вам действительно не нужно - просто выбросьте существующий документ и замените его. В качестве альтернативы, просто оберните свой элемент в более подходящий корневой элемент (вы все равно не должны редактировать корневой узел), и все будет готово.
Конечно, это не ответ на ваш вопрос. Есть уродливый 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.
Кажется, вы путаете переменные со значениями, которые они содержат. Назначение
node = textInput.text;
изменяет значение, на которое указывает nodeПеременная, ничего не меняет с объектом, на который в настоящее время указывает node. Чтобы делать то, что вы хотите, вы можете использовать метод setChildren класса XML:
node.setChildren(textInput.text)
Ах, спасибо, Тео - действительно, кажется, я запутался. Я думаю, что причиной недоумения послужило то обстоятельство, что я мог назначить
textInput.text = node;
Теперь я предполагаю, что это просто неявный вызов XML.toString () для преобразования XML-> String. setChildren () - это то, что я искал.