Flash und XML: Childs ansprechen, das kann doch nicht soo schlecht sein

chricken

Mitglied
Moin, ich bin grad dabei, eine Routine zu programmieren, mit der ich XML-Daten einlesen kann.
Iszt auch alles Cool und funktioniert weitestgehend.
Aber meine Frage ist:
Kann man wirklich nicht direkt auf die einzelnen Childs zugreifen.
In meinem Buch und in der Online-Hilfe ist nur die Rede von firstChild, nextSibling etc. Aber keine Möglichkeit, direkt auf ein Child zuzugreifen.
Ich meine, gibt es wirklich nichts wie z.B. xmlobjekt.firstChild.child[2] (Nein, das funktioniert nicht)
Das können die Entwickler doch nicht vergessen haben.
Ich hangle mich hier durch meinen XML-Baum durch, das ist total ätzend. Drum frag ich nach einfachen Alternativen.

PS: Ich benutze Flash 8 pro
 
Hallo,

doch klar gibts das.

Code:
//XML

<xml>
    <mutter>
         <kind>Mein</kind>
         <kind>Name</kind>
    </mutter>
    
    <kind>ist</kind>
    
    <mutter>
         <kind>Eugen</kind>
    </mutter>
</xml>

Actionscript:

Code:
// in meinXML hast du alle XML-Daten eingeladen

trace (meinXML.firstChild.firstChild.firstChild.nodeValue);
trace (meinXML.firstChild.firstChild.childNodes[1].nodeValue);
trace (meinXML.firstChild.childNodes[1].nodeValue);
trace (meinXML.firstChild.childNodes[2].firstChild.nodeValue);

//OUTPUT:
//Mein 
//Name
//ist
//Eugen

Diese Lektüre kann ich dir dazu nur empfehlen.

gruss

EDIT: Boa, da hab ich mal wieder gepatzert. Musste den Code korrigieren :(
 
Zuletzt bearbeitet:
Hallo, ich hab nach einer Möglichkeit gesucht, XML einzulesen und bin auf diesen Thread gestoßen.

ich habe das obige Beispiel ausprobiert und bei mir ist der Output deutlich anders:
Flash_Trace hat gesagt.:
undefined
undefined
undefined
undefined

Sinn meiner Flash-Applikation ist es ein Quiz für Mediengestalter für Bild und Ton zu programmieren.

XML-Datei(bgfk1.xml):
XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<quiz>
    <mutter>
         <kind>Mein</kind>
         <kind>Name</kind>
    </mutter>
    
    <kind>ist</kind>
    
    <mutter>
         <kind>Eugen</kind>
    </mutter>
</quiz>

Flash-Actionscript-Prozeduren:
Code:
//Habe in einem vorherigen Frame schon "var datei_xml = new XML();" deklariert.
//Button-Code:

on(press)
{
	abfrageart = 1;
	datei_xml.load("./bgfk1.xml");
	datei_xml.onLoad = ladeabfrage;
}

//Funktion "ladeabfrage" springt zu einem Frame mit diesem Code:

stop();

trace (datei_xml.firstChild.firstChild.firstChild.nodeValue);
trace (datei_xml.firstChild.firstChild.childNodes[1].nodeValue);
trace (datei_xml.firstChild.childNodes[1].nodeValue);
trace (datei_xml.firstChild.childNodes[2].firstChild.nodeValue);

onEnterFrame()
{
	//dynamisches Textfeld füllen:
	_root.frage_txt.text = datei_xml.firstChild.childNodes[1].nodeValue;
}

Ich hoffe, ihr könnt mir helfen.
Sogar diese elende Flash-Hilfe hilft einem nicht weiter oder wenn wenigstens ne Suchmaschine einen kompletten Beispiel-Code liefern würde.

Ciao:

Adam
 
Zuletzt bearbeitet von einem Moderator:
Hi,

Du musst das XML-Objekt zuerst deklarieren und solltest dafür sorgen, das Whitespaces ignoriert werden, da sonst alle Umbrüche und Tabulatorzeichen als Textknoten interpretiert werden:
Code:
var datei_xml = new XML();
datei_xml.ignoreWhite = true;

Steht - wenn auch etwas versteckt - alles in der Doku zur XML-Klasse.

Gruß

P.S. @threadersteller: Mehrzahl von child ist children. ;)
.
 
Hallo Tobias,

vielen Dank für deine schnelle und tolle Hilfe.

Mit der XML-Datei, die ich von oben aufgegriffen habe, kam bei mir immer wieder "NULL".

Mit der XML-Datei, die ich vorher schon erstellt habe, wird mir wenigstens der definierte Knoten "thema" angezeigt("Bildgestaltung Fragenkatalog 1") doch dann folgen wieder undefined und zwei mal "null".

Aber wenn mir schon wenigstens das Thema angezeigt wird, bin ich schon mal gut unterwegs. Also nochmal vielen Dank.

Werde jetzt versuchen da durchzusteigen.

Machts gut


Adam
 
Um Dir zu sagen, wie Du die Knoten aus Deiner eigenen XML-Datei korrekt ausliest, müsste ich diese XML-Datei sehen.

Generell ist die Struktur nicht allzu schwer zu begreifen: Jeder XML-Knoten kann über mehrere Childnodes verfügen, die dann in dem Array childNodes zu finden sind. Jedes Element dieses Arrays kann wieder über ein eigenes childNodes-Array verfügen:
Code:
<foo name="foo1"> // XMLObject.childNodes[0].attributes.name ergibt "foo1"
    <bar>Hallo</bar> // XMLObject.childNodes[0].childNodes[0].nodeValue ergibt "Hallo"
</foo>

Gruß
.
 
Hi Tobias,

hehe - keine Sorge, habs schon soweit hinbekommen ;)
Hat zwar lange gedauert, aber jetzt hab ich es soweit.
Wenn du dennoch an meiner XML-Datei interessiert bist:
http://osmatadores.piranho.com/bgfk1.xml

Und für die Leute, die das gleiche Problem haben, wie ich, hier meine Wege:
Code:
	var fragen_gesamt = datei_xml.firstChild.childNodes[1].childNodes.length;
	var antworten_gesamt = datei_xml.firstChild.childNodes[2].childNodes.length;
		
	var thema = datei_xml.firstChild.childNodes[0].childNodes[0].nodeValue;
	var frage = datei_xml.firstChild.childNodes[1].childNodes[frage_aktuell].childNodes[0].firstChild.nodeValue;
	var antwort1 = datei_xml.firstChild.childNodes[1].childNodes[frage_aktuell].childNodes[1].firstChild.nodeValue;
	var antwort2 = datei_xml.firstChild.childNodes[1].childNodes[frage_aktuell].childNodes[2].firstChild.nodeValue;
	var antwort3 = datei_xml.firstChild.childNodes[1].childNodes[frage_aktuell].childNodes[3].firstChild.nodeValue;
	var antwort4 = datei_xml.firstChild.childNodes[1].childNodes[frage_aktuell].childNodes[4].firstChild.nodeValue;
	var antwort5 = datei_xml.firstChild.childNodes[1].childNodes[frage_aktuell].childNodes[5].firstChild.nodeValue;

Was ich jetzt noch nicht ganz verstehe bei diesem XML-Mist ist, dass man am Schluss nochmal das Child ansprechen muss, obwohl man eigentlich schon am Ziel ist. Für den Namen kann ich in meinem Beispiel folgendes schreiben:

var antwort5 = datei_xml.firstChild.childNodes[1].childNodes[frage_aktuell].childNodes[5].nodeName;

für den Wert muss ich dann aber folgendes schreiben.

var antwort5 = datei_xml.firstChild.childNodes[1].childNodes[frage_aktuell].childNodes[5].firstChild.nodeValue;

Naja, ist wohl so ne Sache, die man einfach nicht kapieren muss :)
Deshalb, danke Tobias!

Ciao:

Adam
 
Naja, ist wohl so ne Sache, die man einfach nicht kapieren muss
Doch, das geht: Mit datei_xml.firstChild.childNodes[1].childNodes[frage_aktuell].childNodes[5] bist Du - korrekterweise - bei Deinem Zielknoten angelangt. Die Eigenschaft "nodeValue" bezeichnet nun aber nicht den (Text)Inhalt eines solchen Knotens, sondern den Inhalt eines Textknotens (das ist ein Knoten der nur aus Textinhalt besteht). Wenn in einem XML-Knoten Text steht, handelt es sich um den ersten Kindknoten dieses XML-Knotens (und zwar um einen Textknoten):
Code:
<foo>bar</foo>
  |   |
  |   ---> erstes child von "foo" (Textknoten)
  ---> XML-Knoten "foo"

Gruß
.
 
Hi Tobias,

ah, verstehe. Dann kann man den Text dann praktisch als neuen Knoten sehen.
Naja, war wohl zu sehr an HTML gewöhnt, das wider Erwarten wenig mit XML zu tun hat.

Hast mir sehr geholfen. Weiterem Nutzen von XML steht jetzt wohl nichts mehr im Wege.

Ciao:

Adam
 
Zurück