Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 09-02-2006, 19:05   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2002
Beiträge: 102
Question Rekursionen beim Parsen vermeiden ?

Hallo!

Ich habe vor ,aus einem XML Object ein Flash Objekt zu generieren. Im Gegensatz zu den mir bekannten Lösungen möchte ich aber zusätzlich die Verknüpfungen zwischen den Knoten, also firstChild, nextSibling usw beibehalten.

Mein Lösungsansatz war nun, statt der üblichen for..in Schleife das XML mit nextSibling zu durchlaufen:

PHP-Code:

public function parse($node:XMLNode$callObj:Object):Object {
        
    var 
object = new Object();
    
    var 
firstNode $node.firstChild;        
    if (
firstNode != null) {
        
object[firstNode.nodeName] = parse(firstNodeobject);
    }

    var 
nextNode $node.nextSibling;        
    if (
nextNode != null) {
        
$callObj[nextNode.nodeName] = parse(nextNode$callObj);
    }
        
    return 
object;

Eigentlich ganz nett, es funktioniert und die Mitführung des aufrufenden Objekts erlaubt es mir (in der erweiterten Codeversion) unter anderem tatsächlich die gewünschten Verknüpfungen zu erzeugen, nur ...

... dadurch dass ich das XML auch quasi in der Breite rekursiv durchlaufe komme ich im Gegensatz zur Schachtelungstiefe sehr leicht über die erlaubten 256 Stufen - eine etwas längere Liste mit Knoten reicht da schon.

Wie vermeide ich das am besten, und laufe trotzdem in etwa wie gezeigt durch das Objekt, bzw gibt es einen anderen Weg, diese Verknüpfungen beim Parsen mit im resultierenden Flashobjekt abzubilden?


Frank Kudermann
--------------------------------------------------
http://www.alphanull.de

Geändert von frankiee (09-02-2006 um 19:12 Uhr)
frankiee ist offline   Mit Zitat antworten
Alt 09-02-2006, 19:13   #2 (permalink)
Flashaholic
 
Benutzerbild von atothek
 
Registriert seit: Feb 2003
Ort: Berlin
Beiträge: 1.459
schau dir mal meine XML Iteratoren an

XML Iterator

der durchlooft nen XML tree linear mit einer while schleife, und das ganze ohne rekursion, ich bin leider immer noch nicht zu einem kompletten beispiel gekommen

mfg
alex
__________________
TVNEXT Solutions
atothek ist offline   Mit Zitat antworten
Alt 09-02-2006, 20:11   #3 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.324
"..sehr leicht über die erlaubten 256 Stufen.."
kein wunder, du verschachtelst ja jedesmal.
ein rekursiver aufruf hat nur dann zu erfolgen, wenn es eine stufe (einen ordner) tiefer geht.
da musst du schon einen bär von einem xml haben, um die 256 zu knacken.
Code:
function fXMLParsen(_xml, _tiefe) {
	do {
		if (_xml.hasChildNodes()) {
			fXMLParsen(_xml.firstChild, _tiefe+1);
		} else {
			trace(_tiefe+":"+_xml);
		}
	} while (_xml=_xml.nextSibling);
}
_xml = new XML("<a>aaa</a><a>aaa<b>bbb</b><b>bbb<c>ccc</c></b></a><a>aaa</a>");
fXMLParsen(_xml.firstChild, 0);
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 09-02-2006, 21:29   #4 (permalink)
Neuer User
 
Registriert seit: Jan 2005
Ort: In the arena
Beiträge: 165
Zitat:
Zitat von frankiee
Mein Lösungsansatz war nun, statt der üblichen for..in Schleife das XML mit nextSibling zu durchlaufen:
nimm doch statt "statt" beides minus "in" und du hast die mutter aller xml-rekursiv-schleifen
Code:
for (var sibNode:XMLNode=node; sibNode != null; sibNode=sibNode.nextSibling)
{
	// ...
}
clownesque grüße
-sh
__________________
+++
Even a stopped clock gives the right time twice a day
subHero ist offline   Mit Zitat antworten
Alt 11-02-2006, 18:20   #5 (permalink)
Neuer User
 
Registriert seit: Oct 2002
Beiträge: 102
wow, danke, das waren ja gleich mal drei brauchbare Ansätze! Hab mich für die do...while Schleife entschieden, da sie meiner Denke doch am nächsten kam und sich auch die Verkettungsgeschichten recht einfach lösen liessen.

Hat wer Interesse am finalen Code? Dann poste ich es gerne hier!

Überlege auch gerade, ob ich nicht doch eine Unterklasse der "Object" Klasse definieren soll, da es ja auch darum gehen soll nicht nur zu iterieren, sondern auch neue Knoten einzufügen, etc. wo dann doch etwas mehr "Arbeit" geleistet werden muss. Mach mir auch Sorgen um die Speicherverwaltung, da es ja jetzt auch nicht mehr genügt, Objekte zu löschen, weil die Referenzen in anderen Objekten ja immer noch vorhanden wären. Hat wer Erfahrung mit sowas?
frankiee ist offline   Mit Zitat antworten
Alt 13-02-2006, 12:29   #6 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
klaro sind wir am Ergebnis interessiert!
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 06:13 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele