XML Daten weiterschalten...

SonMiko

Erfahrenes Mitglied
Hallo zusammen,

ich habe folgenden Code im AS
Code:
var ladeversuche:Number = 0;
var maxladeversuche:Number = 3;

var diary:XML = new XML();
var diarycontent:String = "_content/xml.xml";
diary.ignoreWhite = true;
diary.load(diarycontent);

var Datum:String, Uhrzeit:String, Autor:String, Inhalt:String;

diary.onLoad = function(){
	ladeversuche++;
	if(diary.loaded){
		var diaryarray:Array = diary.firstChild.firstChild.childNodes;
		for(var i:Number=0; i<diaryarray.length; i++){
		_root[diaryarray[i].nodeName] = diaryarray[i].firstChild.nodeValue;
		}
		gotoAndStop(2);
	}
	else{
		if(ladeversuche<maxladeversuche){
		diary.load(diarycontent);
		}
		else{
		gotoAndStop(3);
		}
	}
	}
stop();

Die XML Datei (xml.xml) im Verzeichnis "_content/", sieht wie folgt aus
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Diary>
	<Eintrag>
		<Datum>24.12.2006</Datum>
		<Uhrzeit>11:11 Uhr</Uhrzeit>
		<Autor>Irgendwer</Autor>
		<Inhalt>Blaaa vlsdl dfldf dfld fdld fdfldf dfldf dfldf df dfldf dfldfldfglfhglfghpojdrglkjdfg fghlkfg</Inhalt>
	</Eintrag>
	<Eintrag>
		<Datum>654</Datum>
		<Uhrzeit>9879879</Uhrzeit>
		<Autor>0055597</Autor>
		<Inhalt>Blaaa vlsdl dfldf dfld fdld fdfldf dfldf dfldf df dfldf dfldfldfglfhglfghpojdrglkjdfg fghlkfg</Inhalt>
	</Eintrag>
</Diary>

Wenn ich den Code ausführe,
er, ich sehe den ersten Eintrag bzw. Datensatz.
Das Datum, dann die Uhrzeit, den Autor und schließlich den Inhalt.
Wie kann ich den nächsten Teil (sibblin) im Child sehen? Also den nächsten Eintrag
Ich brauch quasi einen Button ("weiter_btn"), diese Button soll per klick, das Array welches die Daten beinhaltet, inkrementieren. Ein späterer Zurückbutton, den wir aber mal weg lassen damit ich durch den Code blicke, wird später das Gegenteil tun.
Wo muss ich hochzählen, wie siehts mit der Aktualisierung der Textfelder aus Brauch ich ein Update After Event

Bin ein wenig ratlos und wäre über Hilfe sehr dankbar

Der Code ist noch nicht ganz vollständig.
Bei den Frame 3 kommt noch eine Fehlermeldung...
Das Krieg ich aber schon hin.

Wichtig ist nur der Button.


Besten Gruß,

Mike
 
Hallo

aus einem ähnlichen Projekt habe ich folgenden AS-Code für einen Weiter-Button

Code:
next_btn.onRelease = function() {
	if(currentIndex >= (gal_data.firstChild.childNodes.length-1)){
		break;
	} else {
		currentIndex++;
		updateSlide(currentIndex);
	}
};

function updateSlide(act_image) {
	status_mc._visible = 1;
	image = gal_data.firstChild.childNodes[act_image].attributes.src;
	header = gal_data.firstChild.childNodes[act_image].attributes.name;
       //mache etwas mit den Daten
}

wobei gal_data deinem diary entspricht.
currentIndex gibt mir an wo aktuell auf welcher Seite ich mich befinden.
und updateSlide ist die Funktion, die meine Daten verarbeitet.

Vielleicht hilft dir der Ansatz ja weiter.

Gruß.
 
woh woh woh...

Mist blick ich garnicht durch
Aber überhaupt nicht :-|...
Was ist denn "currentIndex"?
Oder ist das Teil deines Projektes?

Bin Anfänger in XML... daher ist es schwer für mich das auseinander zu wurschteln.

Trotzdem tausend Dank für die Mühe und Umstände.

Besten Gruß,

Mike
 
Hallo

currentIndex ist aus meinem Projekt und enthält den Stand welchen Datensatz ich gerade auslese, denn um Weiter und Zurück zuschalten, musst du ja auch wissen wo du bist.

Die Funktion updateSlide würde ich an deiner Stelle updateDiary nennen, die Dir den Datensatz für einen Eintrag ausliest.

Gruß.
 
Mein Problem liegt doch hier
Code:
var diaryarray:Array = diary.firstChild.firstChild.childNodes;
		for(var i:Number=0; i<diaryarray.length; i++){
		_root[diaryarray[i].nodeName] = diaryarray[i].firstChild.nodeValue;
		}

Irgendwie muss ich doch das Array hochzählen können.
Ich habe wie man sieht die Namen der Knoten als Variablen verwendet.
Auf der Bühne befinden sich also
"var Datum:String, Uhrzeit:String, Autor:String, Inhalt:String;"
in Form einzelner Dynamischer Textfelder wieder.

Ich muss doch also nur noch den gesamten Datensatz um eins erhöhen, mehr nicht
Gegebenenfalls noch aktualisieren, damit der Code erneut ausgeführt werden kann...
 
Hallo,

dieser Code hier stimmt insofern nicht, als dass ein XML-Knoten zwar einem Array ähnlich, jedoch kein Array ist:
Code:
var diaryarray:Array = diary.firstChild.firstChild.childNodes;

Probiers mal damit:
Code:
var diaryNode: XMLNode = diary.firstChild.firstChild.childNodes;

Und das hier gibt dir die Anzahl Kind-Knoten von diaryNode zurück:
Code:
var l: Number = diaryNode.length;

Nun könntest du in einer Variable eine Zahl speichern, für die gilt 0 < Zahl < l.
Die Zahl verwendest du dann, um quasi den aktuellen Index von diaryNode zu bekommen. Diesen Wert kannst du nun z.B. mit Buttons inkrementieren/dekrementieren. Der aktuelle Eintrag wäre dann z.B.:
Code:
var i: Number = 0
var aktuellerEintrag: XMLNode = diaryNode[i];

Nun könntest du eine Funktion schreiben, die den Variablen für die Textfelder nach jeder Inkrementierung/Dekrementierung wieder die aktuellen Werte zuweist:
Code:
function zeigeAktuellenEintrag (): Void {

      var node: XMLNode = diaryNode.childNodes[_root.i];
      _root.Datum = node.firstChild.firstCHild.nodeValue;
      _root.Uhrzeit = node.childNodes[1].firstCHild.nodeValue;
      _root.Autor = node.childNodes[2].firstCHild.nodeValue;
      _root.Inhalt = node.childNodes[3].firstCHild.nodeValue;
}

weiterButton.onRelease = function () {
     _root.i++;
     _root.zeigeAktuellenEintrag();
}


zurückButton.onRelease = function () {
     _root.i--;
     _root.zeigeAktuellenEintrag();
}

Vom Prinzip ist das in etwa dasselbe, das cheops gepostet hat.
Hier findest du mehr zur XMLNode-Klasse.

gruss
 
Zuletzt bearbeitet:
So langsam versteh ichs...

Was mich aber noch interessiert ist folgendes.

Meine XML Datei (xml.xml)...
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<Diary>
	<Eintrag>
		<Datum>24.12.2006</Datum>
		<Uhrzeit>11:11 Uhr</Uhrzeit>
		<Autor>Irgendwer</Autor>
		<Inhalt>Test1</Inhalt>
	</Eintrag>
	<Eintrag>
		<Datum>25.12.2006</Datum>
		<Uhrzeit>12:12 Uhr</Uhrzeit>
		<Autor>Irgendwer Anders</Autor>
		<Inhalt>Test2</Inhalt>
	</Eintrag>
</Diary>

Der Aufbau der XML Datei, der interessiert mich, ich glaube da liegt auch das Problem zum Verständnis. Das Wurzelelement ist
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
richtig?
Dessen firstChild ist
Code:
<Diary>
und dessen firstChild ist
Code:
<Eintrag>
Soweit so gut.
Nun kommt der Teil den ich nicht verstehe.
Wie unterscheide ich zwischen dem ersten und dem zweiten Eintrag?
Wenn ich Flash mit AS sage das es ab hier, also diary.firstChild.firstChild.childNodes einer Variablen zuweise, gilt das dann von
Code:
<Eintrag>
		<Datum>24.12.2006</Datum>
		<Uhrzeit>11:11 Uhr</Uhrzeit>
		<Autor>Irgendwer</Autor>
		<Inhalt>Blaaa vlsdl dfldf dfld fdld fdfldf dfldf dfldf df dfldf dfldfldfglfhglfghpojdrglkjdfg fghlkfg</Inhalt>
	</Eintrag>
	<Eintrag>
		<Datum>654</Datum>
		<Uhrzeit>9879879</Uhrzeit>
		<Autor>0055597</Autor>
		<Inhalt>Blaaa vlsdl dfldf dfld fdld fdfldf dfldf dfldf df dfldf dfldfldfglfhglfghpojdrglkjdfg fghlkfg</Inhalt>
	</Eintrag>
also von Eintrag bis zum letzten Eintrag Tag?
Und wie genau werden die Daten dann in der Variablen, bw. im Array (du nanntest es XMLNode) gespeichert?

Besten Gruß,

Mike
 
Die XML Datei muss fehlerhaft sein.
Ich bekomme immer nur eine Länge von 4, wenn ich diese Ausgebe (diarryarray.length).
Auch bei deinem Weg.

Dabei müssten es 8 sein.
Lasse ich das schließende und öffnende Tag zum Eintrag in der Mitte weg,
so dass beide Teile, bzw. beide Einträge (Datum+Zeit+Autor+Inhalt) nur von einem Tag Paar umschlossen sind, dann ist die Anzahl 8.
Wie kann ich das dann trennen?

Man jetzt verstehe ich garnichts mehr und bin depressiv :-s...
 
Hallo,

das "Wurzel-Element" ist die Dokumententyp-Deklaration mit dem Parameter der Codierung und dem Verweis auf den Betrieb des XML's.

Das mal so im Voraus:

"firstChild" ist ein Synonym von "childNodes[0]".

Code:
var diaryNode: XMLNode = diary.firstChild.firstChild.childNodes;

diary:
Steht für dein XML-Symbol, in dem sich der gesamte geparste XML-Content befindet. Mit den childNNodes-Anweisungen kanst du bestimmte Punkte in diesem Objekt ansprechen.

firstChild:
Steht für den ersten Knotenpunkt in deinem Dokument bzw. dem XML-Objekt. In unserem speziellen Fall ist das der Knoten <Diary>

firstChild:
Steht für das erste Element im <Diary>-Knoten, d.h. den ersten <Eintrag>-Knoten.

childNodes:
Steht für alle Elemente im <Eintrag>-Knoten, also im Prinzip für das hier:

Code:
<Datum>24.12.2006</Datum>
<Uhrzeit>11:11 Uhr</Uhrzeit>
<Autor>Irgendwer</Autor>
<Inhalt>Test1</Inhalt>
Würdest du nun definieren, welches Element genau du ansprechen möchtest, müsstest du (und darin besteht die Ähnlichkeit mit Arrays) einen Index angeben:
Code:
trace (diary.firstChild.firstChild.childNodes[2]);

//Output: Irgendwer

Wichtig ist: Ein Knoten-Element, sei es nun ein simples oder eines mit vielen Unter-Elementen ist KEIN Array, auch wenn sich die Bedienung beider Klassen ähnelt.

gruss

EDIT:
Dabei müssten es 8 sein.
Datum, Uhrzeit, Autor, Inhalt.....vier Punkte, oder wie rechnest du da?
 
Zuletzt bearbeitet:
Zurück