Probleme beim auslesen von XML-Knoten

ksk

Erfahrenes Mitglied
Hy @ all!

Ich habe folgendes problem:
Ich lese eine XML-datei mit folgendem Aufbau:

Code:
<stamm>
	<Anton sex="m">
		<Berta sex="m">
			<Caesar sex="m">
				<Delta sex="m">
					<Emil sex="m">
.....
usw.
.....
ca. ab den 12 Element kommen Unterelemente welche wiederum Unterelemente hat usw.
Die datei lese ich mit
Code:
var XMLdaten = new XML();
XMLdaten.ignoreWhite=true;
XMLdaten.load("alpha.xml");
XMLdaten.onLoad = function(success) {
    anzahl = XMLdaten.firstChild.childNodes.length;  
}
aus. "anzahl" ist in dem Fall ein Textfeld.
So, jetzt zu meinem Problem. Beim Debuggen ist mir aufgefallen, das Flash nur ein Element als Objekt gefunden hat. Und in diesem Obejkt, sind die anderen Unterelement in der childNodes[0]-Eigenschaft. Und in dessen childNodes[0]-Eigenschaft ist das nächste Unterelement usw.

Gibt es eine Möglichkeit die Knoten einzeln in ein Array einzulesen bzw. eine For in - Schleife welches alle childNodes durch geht.

Da ich OO in Flash programmieren möchte, habe ich dazu eine Klasse erstellt, in der ich die Objekte übergeben möchte. Das übergeben der Objekte an die Klasse wäre nicht das Problem, aber alle Knoten durch zu gehen ist im Momment mein Problem.


Ich hoffe das ich es verständlich ausdrücken konnte und wäre für jede Hilfe sehr dankbar.


ksk
 
Hi,

Du hast also einen XML-Baum, dessen verschachtelte Knoten Du in eine lineare Form übertragen willst?

Prinzipiell könntest Du (mit Hilfe einer rekursiven Methode) so vorgehen:
Code:
function parse(dest_array, nodes) {
  for (var i=0; i<nodes.length; i++) {
    var obj = {name:nodes[i].attributes.NodeName, sex:nodes[i].attributes.sex};
    dest_array.push(obj);
    if (nodes[i].childNodes.length > 0) {
        dest_array = parse(dest_array, nodes[i].childNodes);
    }
  }
}

myXML.onLoad = function() {
    var inhalte = new Array();
    inhalte = parse(inhalte, this.childNodes);
}
(Freihand gepostet, daher u.U. fehlerbehaftet)

Um sicherzugehen, dass ich Dein Problem korrekt verstanden habe, wäre es sinnvoll, die Original-XML zu sehen.

Ist es denn überhaupt notwendig, dass die XML-Datei in dieser verschachtelten Form vorliegt, wenn Du im Endeffekt eine lineare Liste bekommen möchtest?

Gruß
.
 
Hy!

Danke für die Antwort, ich glaube da komme ich einbisschen näher an meinem Ziel.

Das ganze soll für mich eine Übung sein um mich mit AS vetraut zu machen.
Es soll dann auch später die Möglichkeit geben weiter Personen zu erfassen, nachdem man bsp. in der ComboBox jemanden ausgewählt hat.
Bsp. person 12 wird gewählt und es soll ein Kind angelegt werden welches auch wiederum in die XML-Datei gespeichert werden soll.


Hier mal die XML-Datei:
Ahja, bitte nicht erschrecken.
XML:
<?xml version="1.0" encoding="ISO-8859-1"?>

<stamm>
	<person1 sex="m">
		<person2 sex="m">
			<person3 sex="m">
				<person4 sex="m">
					<person5 sex="m">
						<person6 sex="m">
							<person7 sex="m">
								<person8 sex="m">
									<person9 sex="m">
										<person10 sex="m">
											<person11 sex="m">
												<person12 sex="m">
													<kinder>
														<kind1 sex="w">
															<desc>ein beliebiger Text</desc>
														</kind1>

														<kind2 sex="m">
															<kinder>
																<kind1 sex="w">
																	<kinder>
																	</kinder>
																</kind1>

																<kind2 sex="w">
																	<kinder>
																	</kinder>
																</kind2>

																<kind3 sex="m">
																	<kinder>
																		<kind1 sex="m">
																			<kinder>
																				<kind1 sex ="w">
																					<kinder>
																					</kinder>
																				</kind1>
																			</kinder>
																		</kind1>

																		<kind2 sex="m">
																			<kinder>
																			</kinder>
																		</kind2>

																		<kind3 sex="m">
																			<kinder>
																				<kind1 sex ="w">
																					<kinder>
																					</kinder>
																				</kind1>	
																				<kind2 sex ="w">
																					<kinder>
																					</kinder>
																				</kind2>	
																			</kinder>																		
																		</kind3>

																		<kind4 sex="w">
																			<kinder>
																			</kinder>
																		</kind4>

																		<kind5 sex="w">
																			<kinder>
																			</kinder>
																		</kind5>
																	</kinder>
																</kind3>
															</kinder>
														</kind2>
													</kinder>
												</person12>
											</person11>
										</person10>
									</person9>
								</person8>
							</person7>
						</person6>
					</person5>
				</person4>
			</person3>
		</person2>
	</person1>
</stamm>

Der Text "personx", sowie "kindx" wird durch einen eindeutigen Namen ersetzt.


Gruß
ksk
 
Zuletzt bearbeitet von einem Moderator:
Hi,

prinzipiell lässt sich so ein Baum mit der von mir vorgeschlagenen Methode erfassen und in eine linieare Liste transformieren. Bestimmte Regeln (z.B. dass einige Knoten als einziges Child einen Knoten namens "kinder" haben, der wiederum weitere Personen aufnimmt) müssten dabei beachtet werden.

Nach wie vor sehe ich allerdings nicht den Sinn darin, den Baum derart verschachtelt anzulegen - geht es z.B. um die grafische Darstellung eines Stammbaums, sollten die Kinder durchaus als Kindknoten ihrer Eltern angelegt werden (dann entfällt aber die Notwendigkeit, diese Teilbäume in lineare Listen zu transformieren, da die Baumstruktur ja essentiell ist); warum aber person1 bis person12 verschachtelt vorliegen, wird mir nicht klar. Logischer (und weitaus einfacher zu parsen) wäre z.B. folgender Aufbau:
XML:
<stamm>
  <person name="1" sex="m" />
  <person name="2" sex="m" />
  <person name="3" sex="m" />
  <person name="4" sex="m" />
  <person name="5" sex="m" />
  <person name="6" sex="m" />
  <person name="7" sex="m" />
  <person name="8" sex="m" />
  <person name="9" sex="m" />
  <person name="10" sex="m" />
  <person name="11" sex="m" />
  <person name="12" sex="m" />
    <kinder>
      <person name="12_1" sex="w">
        <desc>ein beliebiger Text</desc>
      </person>
      <person name="12_2" sex="m">
        <kinder>
          <person name="12_2_1" sex="w">
        <kinder>
      </person>
    </kinder>
  </person>
</stamm>
Durch die eindeutige Benennung der Knoten kann (wenn es sich um einen "person"-Knoten handelt), geprüft werden, ob der Knoten weitere ChildNodes vom Typ "desc" oder "kinder" hat; im letzereren Fall wird die Funktion rekursiv für die Kinder dieses Nodes aufgerufen.

Gruß
.
 
Zuletzt bearbeitet von einem Moderator:
Hy,

... der edanke ist, das bsp. person1 der Vorfahre vonperson2 usw. ist.
Person12 kann in diesem fall der Ur- Ur- Ur- ... Urenkel sein. Daher sollte es Dynamisch sein wiviele Vorfahren die Eltern haben.
Einfacher wäre es natührlich wenn man im Vorhinein Weiß ab welcher Generation, die Kinder bekannt sind. So kann man das auf dieser Art und Weise welches du vorgeschlagen hast, einfach lösen.

Ich habe mir gedacht das ich es irgendwie so in etwa löse.
Allerdings ist das nur ein Ansatz wie ich mir das ungefähr vorstelle. So funktioniert es nicht aber ich bin gerade dabei eine lösung zu finden.
Code:
if (nodes[i].nodeName!="stamm"){
		if (nodes[i].nodeName=="kinder" ){
			for (var j=0; j<nodes.length; j++) {
				if (nodes[i].nodeName!="kinder"){
					cmbPerson.items.add(new cKinder(id, nodes[j].nodeName, nodes[j].attributes.sex));
				}
			}
		}else{
			cmbPerson.items.add(new cPerson(id, nodes[i].nodeName, nodes[i].attributes.sex));
			id = (id +1);
		}
  	}
Nach dem ersten Knoten (stamm) soll überprüft werden ob es sich um ein Kindobjekt handelt, wenn nicht wird es als Objekt der Klasse cPerson gespeichert und es wird eine ID zugewiesen. Wenn es sich um ein Kindobjekt handeln sollte, bsp. nach dem 6., 9. oder 12. Vorfahren, in einer Schleife dessen Unterknoten durchgegangen werden. Und die Kinder werden in einer anderen Klasse (cKinder), mit der ID vom Eltern (Vorfahre) gespeichert.

Das ganze klinkt bisschen Konfus, aber so wäre es finde ich am einfachsten, ohne rücksicht auf den Optischen Aufbau von der XML-Datei. Soll sie halt so oft geschachtelt werden, aber dafür ist sie in der richtigen Reihenfolge.


Gruß
ksk
 
Na ja,

der edanke ist, das bsp. person1 der Vorfahre vonperson2 usw. ist.
Was liegt dann näher, als Person 2 als Kind von Person 1 zu deklarieren, genau so, wie Du das bei den anderen "Kindern" getan hast?

Ich sehe den semantischen Unterschied zwischen
Code:
<person1>
  <person2 />
</person1>
und
Code:
<person1>
  <kinder>
    <person2 />
  </kinder
</person1>
Nicht - meiner Meinung nach, machst Du es Dir komplizierter als nötig.

Gruß
.
 
Ich werd´s mal auf beide Arten probieren.
Danke dir vorerst mal. Melde mich Morgen Abend evtl. nochmals.


Gruß
ksk
 
Zurück