E4X:Atribuindo ao nó raiz
-
09-06-2019 - |
Pergunta
Estou usando Adobe Flex/Air aqui, mas até onde sei, isso se aplica a todo JavaScript.Já me deparei com esse problema algumas vezes e deve haver uma solução fácil por aí!
Suponha que eu tenha o seguinte XML (usando e4x):
var xml:XML = <root><example>foo</example></root>
Posso alterar o conteúdo do nó de exemplo usando o seguinte código:
xml.example = "bar";
No entanto, se eu tiver isso:
var xml:XML = <root>foo</root>
Como altero o conteúdo do nó raiz?
xml = "bar";
Obviamente não funciona porque estou tentando atribuir uma string a um objeto XML.
Solução
Parece que você confunde variáveis com os valores que elas contêm.A atribuição
node = textInput.text;
altera o valor do variável node
aponta, isso não muda nada com o objeto que node
atualmente aponta para.Para fazer o que você quer, você pode usar o setChildren
método do XML
aula:
node.setChildren(textInput.text)
Outras dicas
Ah, obrigado Theo - na verdade, parece que fiquei confuso.Acho que a raiz da confusão veio do fato de que fui capaz de atribuir
textInput.text = node;
O que agora acho que é apenas uma chamada implícita de XML.toString() para converter XML->String.setChildren() é o que eu estava procurando.
Se você está tentando alterar o elemento raiz de um documento, você realmente não precisa fazer isso - apenas jogue fora o documento existente e substitua-o.Alternativamente, apenas envolva seu elemento em um elemento raiz mais adequado (você não deveria editar o nó raiz de qualquer maneira) e você estará pronto.
Claro, isso não responde à sua pergunta.Existe um hack JS feio que pode fazer o que você quiser, mas tenha em mente que provavelmente é muito mais lento do que o acima.De qualquer forma, aqui está:
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));
Você pode ignorar o comentário fix_syntax_highlighter.