Inhalt einer Variable als Pfad verwenden

chricken

Mitglied
Hallo,
ich habe d ein Problem, das irgendwem vermutlich nur einen kleinen Lacher wert ist. Aber ich komm einfach nicht drauf.
Ich habe in meinem Projekt eine Menge Variablen, die sicher in mehreren Arrays aufbewahrt sind, welche wiederum in einem Objekt organisiert sind.
Das ist aber, glaube ich, nicht so wichtig.

Das eigentliche Problem ist nun, daß ich zwecks Abspeichern in XML diese Werte wieder herausfischen muß. Und weil es so viele sind sollte es natürlich per Schleife laufen.
Nun habe ich es schon soweit gebastelt, daß ich in einer String-Variable den korrekten Pfad stehen habe. Sp weit so gut.
Wenn ich jetzt aber diesen Variableninhalt tatsächlich verwenden will stoße ich an die Grenzen.
mit eval("variablenname") komme ich nicht weiter, denn das liefert nur den Pfad, nicht aber den Inhalt des Pfades.
Sprich: Ich müsste anscheinend zwei eval-Abfragen verschachteln. Aver eine einfache Verschachtelung á la eval("eval("variablenname")"); liefert undefined.

Ich hoffe, das war einigermaßen verständlich.

Meine Flash-Version: 8 pro

Code:
//Array enthält Node-Namen für XML-Datei
var theNodes:Array = new Array("vorname", "nachname", "strasse", "hnr", "ort", "plz", "adresszusatz", "postfach",);	

for(var j:Number=0; j<objekt.nachname.length; j++){
		
		//Unterknoten "profil"
		subnode = save_xml.createElement("profil");
		save_xml.firstChild.appendChild(subnode);
		
		//Profil-Node mit Daten aus dem Array füllen
		for(var i:Number=0; i<theNodes.length; i++){
			subnode2 = save_xml.createElement(theNodes[i]);
			save_xml.firstChild.childNodes[j].appendChild(subnode2);
			var aktuell:String=theNodes[i];
			var aktuell2:String=aktuell + "[" + j + "]";
			var single_node:String="objekt."+ aktuell2;
			trace(aktuell2 + " = " + single_node);
			subnode2a = save_xml.createTextNode(eval(eval("single_node")));
			save_xml.firstChild.childNodes[j].childNodes[i].appendChild(subnode2a);
		}
	}

ps: Single_node ist hier die String-Variable, welche den Pfad enthält

Wäre toll, wenn jemand weiterhelfen könnte :)
Ich geb dann auch ein großes Eis aus: o0>
 
Hi,

mir ist nicht ganz klar, was hier für Pfade gemeint sind und was in den einzelnen Objekten steht. Kannst Du eine Version posten, in der alle relevanten Objekte vernünftig angelegt sind (am besten eine lauffähige .fla)?

Wenn Du das willst, was ich auf den ersten Blick vermute (gültige Referenzen auf Objekte in xml-Knoten ablegen), wird das so nicht funktionieren - hast Du Objektpfade allerdings als String vorliegen, kannst Du sie mit dem Array-Zugriffsoperator in gültige Referenzen verwandeln:
Code:
var target = "ein_MC.noch_ein_MC.ein_textfeld";

target = target.split("."); // Am Punkt trennen

var obj = _root; // Ausgangspfad
for (var i=0; i<target.length; i++) {
	obj = obj[target[i]];
}

trace(obj); // korrekte Referenz

Gruß
.
 
Ich hoffe, ich hab da jetzt keinen allzu schweren Fehler drinnen.
Das Ding ist lauffähig bis auf die alles entscheidende Abfrage.

Code:
objekt=new Object;
objekt.vorname=["hans", "fritz", "Jens"];
objekt.nachname=["Schmidt", "Schulz", "Meyer"];
objekt.strasse=["Dorfstrasse", "Flegelweg", "Bahnhofstrasse"];

for (i=0; i<3; i++){
trace(objekt.vorname[i] + " " + objekt.nachname[i] + " " + objekt.strasse[i]);
}

//XML-Objekt erzeugen
var save_xml:XML = new XML();
save_xml.ignoreWhite = true;
save_xml.contentType = 'text/html';
save_xml.xmlDecl = "<?xml version='1.0' encoding='UTF-8'?>";

//Erster Knoten "Person"
root_node = save_xml.createElement("person");
save_xml.appendChild(root_node);

//---------------------------------------------------------------------------------------
//Jetzt will ich die einzelnen Ojjektteile (Vorname, Nachname und Strasse) automatisch abfragen
//Dazu erstmal ein Array angelegt, welches die Bezeichnungen enthält

var theNodes:Array = new Array("vorname", "nachname", "strasse");

//Dann zwei verschachtelte Schleifen. 
//Die äußere, um die einzelnen Objekte durchzugehen

for(var j:Number=0; j<objekt.vorname.length; j++){
	
	//Unterknoten "profil" im xml anlegen 
	subnode = save_xml.createElement("profil");
	save_xml.firstChild.appendChild(subnode);

//Die innere, um Vorname, Nachname und Strasse durchzugehen
	for(var i:Number=0; i<theNodes.length; i++){
		subnode2 = save_xml.createElement(theNodes[i]);
		save_xml.firstChild.childNodes[j].appendChild(subnode2);
		var aktuell:String=theNodes[i];
		var aktuell2:String=aktuell + "[" + j + "]";
		var single_node:String="objekt."+ aktuell2;
		trace("single_node= " + single_node);
		subnode2a = save_xml.createTextNode("hier soll die fragliche Abfrage hin");
		save_xml.firstChild.childNodes[j].childNodes[i].appendChild(subnode2a);
	}
}
trace(save_xml);

Ich hoffe, jemand kann mir helfen.
 
Hi,

vorausgesetzt, ich habe verstanden, worum es Dir geht (wovon ich nicht ganz überzeugt bin ;)), würde ich es so umsetzen:
Code:
objekt=new Object;
objekt.vorname=["hans", "fritz", "Jens"];
objekt.nachname=["Schmidt", "Schulz", "Meyer"];
objekt.strasse=["Dorfstrasse", "Flegelweg", "Bahnhofstrasse"];

// Knoten herausfinden:
var thenodes = new Array();
for (var i in objekt) {
	if (typeof(objekt[i]) == "object") {
		thenodes.push(i);
	}
}
trace("Eigenschaften: " + thenodes);

//XML-Objekt erzeugen
var save_xml:XML = new XML();
save_xml.ignoreWhite = true;
save_xml.contentType = 'text/html';
save_xml.xmlDecl = "<?xml version='1.0' encoding='UTF-8'?>";
var persnode = save_xml.createElement("person");

for (var person=0; person<objekt[thenodes[0]].length; person++) {
	var profnode = save_xml.createElement("profil");
	for (var prop=thenodes.length; prop>=0; prop--) {
		var propnode = save_xml.createElement(thenodes[prop]);
		var ct = (objekt[thenodes[prop]][person]);
		ct = save_xml.createTextNode(ct);
		propnode.appendChild(ct);
		profnode.appendChild(propnode);
	}
	persnode.appendChild(profnode);
}
save_xml.appendChild(persnode);

trace(save_xml);
Das xml-Objekt hat dann zumindest das Format Deines Scriptes.

Nicht klar ist mir:
  • Warum Du die einzelnen Personen in "profil"-Knoten packst, die wiederum alle in einem "person"-Knoten stecken. Wäre so ein Aufbau nicht übersichtlicher:
Code:
<person>
  <profil>
    <vorname>Jens</vorname>
    <nachname>Meyer</nachmane>
    <strasse>Hauptstr</strasse>
  </profil>
</person>
<!-- hier die nächste Person -->
  • Warum Du nicht folgenden Objektaufbau verwendest:
Code:
var personen = new Aray();
personen[0] = {vorname:"hans", nachmane:"Schmidt", strasse:"Dorfstrasse"};
personen[1] = {vorname:"fritz", nachmane:"Schulz", strasse:"Flegelweg"};
personen[2] = {vorname:"Jens", nachmane:"Meyer", strasse:"Bahnhofstrasse"};
Dann hast Du die (höchstwahrscheinlich dynamische) Anzahl Personen in einem (nicht-assoziativen) Array und die (wahrscheinlich eher fixe) Anzahl Eigenschaften als Objekte in den einzelnen Elementen, was mehr der Struktur des resultierenden xml-Objektes entspräche und Dir einige Zeilen Code ersparen würde.

Gruß
.
 
1. Mit dem zusätzlichen Child hast Du natürlich Recht. Habe es schon geändert.

2. Eigentlich will ich das ganz gerne so behalten, weil ich mich grad dran gewöhnt habe.
Außerdem müsste ich dann auch das Rauspulen der Daten aus der XML-Datei neu machen.

Jetzt bin ich grad dabei, den entscheidenden Unterschied zu suchen, um ihn bei mir anzupassen.

Vielen Dank jedenfalls.
 
Zuletzt bearbeitet:
Zurück