Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top