E4X :Назначение корневому узлу
-
09-06-2019 - |
Вопрос
Здесь я использую 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-хак, который может делать то, что вы хотите, но имейте в виду, что это, скорее всего, намного медленнее, чем выполнение описанного выше.Во всяком случае, вот оно:
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.