E4X:Assegnazione al nodo root
-
09-06-2019 - |
Domanda
Sto utilizzando Adobe Flex/Air qui, ma per quanto ne so questo vale per tutto JavaScript.Mi sono imbattuto in questo problema alcune volte e deve esserci una soluzione semplice là fuori!
Supponiamo di avere il seguente XML (usando e4x):
var xml:XML = <root><example>foo</example></root>
Posso modificare il contenuto del nodo di esempio utilizzando il seguente codice:
xml.example = "bar";
Tuttavia, se ho questo:
var xml:XML = <root>foo</root>
Come posso modificare il contenuto del nodo radice?
xml = "bar";
Ovviamente non funziona mentre sto tentando di assegnare una stringa a un oggetto XML.
Soluzione
Sembra che tu confonda le variabili per i valori che contengono.L'incarico
node = textInput.text;
cambia il valore di variabile node
punta, non cambia nulla con l'oggetto that node
attualmente punta a.Per fare quello che vuoi puoi usare il file setChildren
metodo del XML
classe:
node.setChildren(textInput.text)
Altri suggerimenti
Ah grazie Theo, in effetti sembra che fossi confuso lì.Penso che la radice della confusione provenisse dal fatto che ero in grado di assegnare
textInput.text = node;
Che ora immagino sia semplicemente chiamare implicitamente XML.toString() per convertire XML->String.setChildren() è quello che stavo cercando.
Se stai tentando di modificare l'elemento radice di un documento, non è realmente necessario: basta eliminare il documento esistente e sostituirlo.In alternativa, racchiudi semplicemente il tuo elemento in un elemento root più appropriato (non dovresti comunque modificare il nodo root) e sarai a posto.
Naturalmente questo non risponde alla tua domanda.C'è un brutto hack JS che può fare quello che vuoi, ma tieni presente che probabilmente è molto più lento di quanto sopra.Comunque eccolo qui:
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));
Puoi ignorare il commento fix_syntax_highlighter.