E4X: назначение корневому узлу - PullRequest
1 голос
/ 15 сентября 2008

Я использую 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.

Ответы [ 3 ]

5 голосов
/ 15 сентября 2008

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

node = textInput.text;

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

node.setChildren(textInput.text)
1 голос
/ 15 сентября 2008

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

textInput.text = node; 

То, что я сейчас предполагаю, - это просто простота, вызывающая XML.toString () для преобразования XML-> String. setChildren () - это то, что я искал.

0 голосов
/ 15 сентября 2008

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

Конечно, это не отвечает на ваш вопрос. Есть отвратительный 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.

...