2008-09-15 16 views
1

Ich benutze Adobe Flex/Air hier, aber soweit ich weiß, gilt das für alle JavaScript. Ich bin auf dieses Problem einige Male gestoßen, und es muss eine einfache Lösung da draußen geben!E4X: Zuordnung zum Wurzelknoten

Angenommen, ich habe die folgende XML (mit e4x):

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

ich den Inhalt des Beispiels Knoten ändern kann mit dem folgenden Code:

xml.example = "bar"; 

Allerdings, wenn ich dieses:

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

Wie ändere ich den Inhalt des Wurzelknotens?

Offensichtlich funktioniert nicht, da ich versuche, eine Zeichenfolge zu einem XML-Objekt zuzuweisen.

Antwort

4

Es scheint, Sie verwechseln Variablen für die Werte, die sie enthalten. Die Zuordnung

node = textInput.text; 

ändert den Wert der Variablenode Punkte, ist es nicht etwas mit dem Objekt ändern, dass node zur Zeit verweist. Zu tun, was Sie tun möchten, können Sie die setChildren Methode der XML-Klasse verwenden:

node.setChildren(textInput.text) 
0

Wenn Sie versuchen, das Stammelement eines Dokuments zu ändern, müssen Sie das vorhandene Dokument nicht einfach wegwerfen und ersetzen. Alternativ können Sie Ihr Element einfach in ein geeigneteres Stammelement einfügen (Sie sollten den Stammknoten sowieso nicht bearbeiten) und Sie würden festgelegt.

Natürlich beantwortet das Ihre Frage nicht. Es gibt einen hässlichen JS-Hack, der tun kann, was Sie wollen, aber bedenken Sie, dass es wahrscheinlich viel langsamer ist als das, was Sie tun. Wie auch immer, hier ist es:

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)); 

Sie können den Fix_syntax_highlighter Kommentar ignorieren.

1

Ah danke Theo - in der Tat scheint, ich war verwirrt. Ich denke, dass die Wurzel des confustion aus der Tatsache, kam ich in der Lage war zu vergeben

textInput.text = node; 

Was ich denke, jetzt ist nur implicity Aufruf XML.toString() XML-> String zu konvertieren. setChildren() ist was ich gesucht habe.