2008-09-15 3 views
1

Здесь я использую Adobe Flex/Air, но насколько я знаю, это относится ко всему JavaScript. Я столкнулся с этой проблемой несколько раз, и там должно быть простое решение!E4X: Назначение корневому узлу

Предположим, что у меня есть следующий XML (с помощью e4x):

var xml:XML = <root><example>foo</example></root> 

я могу изменить содержимое примера узла, используя следующий код:

xml.example = "bar"; 

Однако, если у меня есть это:

var xml:XML = <root>foo</root> 

Как изменить содержимое корневого узла?

xml = "bar"; 

Очевидно, что это не работает, поскольку я пытаюсь назначить строку XML-объекту.

ответ

4

Кажется, вы смешиваете переменные для значений, которые они содержат. Назначение

node = textInput.text; 

изменяет значение переменной в node указывает на это ничего не меняет с объектом, который в настоящее время node указывает. Для того, чтобы делать то, что вы хотите сделать, вы можете использовать setChildren метод XML класса:

node.setChildren(textInput.text) 
0

Если вы пытаетесь изменить корневой элемент документа, вам не нужно просто выбросить существующий документ и заменить его. Кроме того, просто оберните свой элемент в более правильный корневой элемент (вы все равно не должны редактировать корневой узел), и вы должны быть установлены.

Конечно, это не отвечает на ваш вопрос. Ужасный 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 комментарий.

1

Ах благодарю вас Тео - на самом деле, кажется, я был смущен там. Я думаю, что корень confustion исходил из того, я был в состоянии назначить

textInput.text = node; 

Что я теперь думаю, это просто неявно вызова XML.toString() для преобразования XML-> String. setChildren() - это то, что я искал.

Смежные вопросы