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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top