XML Anfängerproblem^^

1manni1

Erfahrenes Mitglied
Also da ich noch ein Neuer Anfänger bin in den Sachen mit XML kapier ich das noch nicht ganz mit mehreren childNodes.
Also ich habe diese xml datei:

PHP:
<?xml version="1.0" encoding="iso-8859-1"?>	  
  <navi>
  	<button>
		<name>
			<![CDATA[ überschrift ]]>
		</name>
		<content>
			<![CDATA[ überschrift ]]>
		</content>
	</button>
	<button>
		<name>
			<![CDATA[ lieferung_zahlung ]]>
		</name>
		<content>
			<![CDATA[ lieferung_zahlung ]]>
		</content>
	</button>
	<button>
		<name>
			<![CDATA[ haftung ]]>
		</name>
		<content>
			<![CDATA[ haftung ]]>
		</content>
	</button>
	<button>
		<name>
			<![CDATA[ wiederruf ]]>
		</name>
		<content>
			<![CDATA[ wiederruf ]]>
		</content>
	</button>
	<button>
		<name>
			<![CDATA[ kontakt ]]>
		</name>
		<content>
			<![CDATA[ kontakt ]]>
		</content>
	</button>
  </navi>
  <left>
	  <ueberschrift>
		<![CDATA[ ueberschrift ]]>
	  </ueberschrift>
	  <untertitel>
		<![CDATA[ untertitel ]]>
	  </untertitel>
	  <skype>
		<![CDATA[ skype ]]>
	  </skype>
	  <msn>
		<![CDATA[ msn ]]>
	  </msn> 
	  <icq>
		<![CDATA[ icq ]]>
	  </icq>
	  <aim>
		<![CDATA[ aim ]]>
	  </aim>
  </left>
  <right>
	  <ebayshop>
		<![CDATA[ ebayshop ]]>
	  </ebayshop>
	  <mich>
		<![CDATA[ mich ]]>
	  </mich>
	  <power>
		<![CDATA[ power ]]>
	  </power>
	  <geprue>
		<![CDATA[ geprue ]]>
	  </geprue>
	  <paypal>
		<![CDATA[ paypal ]]>
	  </paypal>
  </right>

Ich habe immer CData genommen weil dort später der text in Html formatiert rein kommen soll d.h. schriftgröße und schriftfarbe.
Und habe das so jetzt hier heute gelesen das man da cdata verwenden soll.
Nund das ist meine fla:

PHP:
var XMLdaten = new XML(); 
XMLdaten.ignoreWhite=true; 
XMLdaten.load("xml.xml"); 
XMLdaten.onLoad = function(success) { 
	if(success){
		anzahlnavi = XMLdaten.childNodes[0].childNodes.length;
		anzahlleft = XMLdaten.childNodes[1].childNodes.length;
		anzahlright = XMLdaten.childNodes[2].childNodes.length;
		buttonname = [];
		buttoncontent = [];
		left = [];
		right = [];
		
		for (var i=0; i<anzahlnavi; i++) {
			buttonname[i] = XMLdaten.childNodes[0].childNodes.childNodes;
			buttoncontent[i] = XMLdaten.childNodes[0].childNodes.childNodes;
		}
		for (var i=0; i<anzahlleft; i++) {
			left[i] = XMLdaten.childNodes[1].childNodes.childNodes; 
		}
		for (var i=0; i<anzahlright; i++) {
			right[i] = XMLdaten.childNodes[2].childNodes.childNodes; 
		}
	}
}

Bei jeder for schleife kommt nicht raus. Ich habe das früher eben immer mit attributen gemacht aber das klappt ja nicht mit cdata.
Könnte mir vllt jemand bei dem problem behilflich sein oder vllt hat auch jemand einen vorschlag wie man das einfacher realisieren kann

Ich habe mal im Anhang noch die Dateien
 

Anhänge

  • xml.zip
    5,3 KB · Aufrufe: 12
Hi,

so ein Konstrukt:
Code:
childNodes.childNodes;
ist schon syntaktisch falsch, da childNodes immer ein Array ist (ein childNodes-Objekt hat also niemals ein Unterobjekt namens "childNodes"). Zudem bist Du mit der Baumstruktur wohl etwas durcheinander gekommen.

Probiers so:
Code:
	if(success){
		
		buttonname = [];
		buttoncontent = [];
		left = [];
		right = []
		
		var navi = this.childNodes[0].childNodes;
		for (var i=0; i<navi.length; i++) {
			buttonname[i] = navi[i].childNodes[0].firstChild;
			buttoncontent[i] = navi[i].childNodes[1].firstChild;
		}
		
		var left_content = this.childNodes[1].childNodes;
		for (var i=0; i<left_content.length; i++) {
			left[i] = new Object();
			left[i]._title = left_content[i].nodeName;
			left[i]._content = left_content[i].firstChild;
		}
		
		var right_content = this.childNodes[1].childNodes;
		for (var i=0; i<right_content.length; i++) {
			right[i] = new Object();
			right[i]._title = right_content[i].nodeName;
			right[i]._content = right_content[i].firstChild;
		}
	}
Anmerkung #1: Ich habe hier jedes Element der Arrays "left" und "right" als Objekt mit den Membern "_title" und "_content" angelegt, wobei _title den Knotennamen (z.B. "skype") und _content den Inhalt des Knotens enthält.

Anmerkung #2: Du solltest die XML-Datei UNICODE- oder UTF8-kodieren, damit die Umlaute korrekt eingelesen werden.

Gruß
.
 
ahh stimmt das hab ich vergessen das ich dann wieder ein array habe... aber dann hätte ich sicher das wieder anders gemacht^^ und das mit nodeName wusste ich auch noch net. schon wieder was dazu gelernt :) bist einfach super (!)

so jetzt hab ich das hier gemacht:

PHP:
		_root.ueberschrift_mc.ueberschrift.html = true;
		_root.ueberschrift_mc.ueberschrift.htmlText = top[0]._content;

Also ich hab noch was dazu gemacht.
die xml sieht an dem teil so aus:

PHP:
  <top> 
   	  <ueberschrift>
		<![CDATA[ <b>ueberschrift<b> ]]>
	  </ueberschrift>
	  <untertitel>
		<![CDATA[ untertitel ]]>
	  </untertitel>
  </top>

Also mit einem html tag drin. Allerdings gibt er mir selbst wenn ich html in dem dyn. textfeld anhab den text aus "<b>ueberschrift<b>" wenn ich es aushabe das hier " &lt;b&gt;ueberschrift&lt;b&gt;" aber ich will ja das hier ueberschrift.
Was mach jetzt noch falsch:confused:
 
Hi,

DU musst die html-Entitäten wieder zurück in "normale" Zeichen wandeln. Such hier im Forum mal nach "parseET", dann findest Du die Funktion, die ich dafür immer verwende.

Gruß
.
 
cool aber eine frage durch was soll ich zB <br> oder zB so etwas <font color="#000000" size="12">hallo</font> also das font tag ersetzen
geht das überhaupt?
 
Hi,

nein, es geht nur um die Entitäten &lt; &gt; &amp; &quot; usw., die in die Zeichen <, >, " und & zurücktransformiert werden müssen.

Gruß
.
 
und wie schaff ich es das diese sachen das wirksam werden zB eben gerade das font-tag oder so etwas <br>
 
Hi,

Du weist den resultierenden String einfach der htmlText-Eigenschaft eines html-Textfeldes zu - z.B. so:
Code:
_root.ueberschrift_mc.ueberschrift.htmlText = parseET(top[0]._content);

Gruß
.
 
mhh so hab ich das auch gemacht :) allerdings kommt dann gar nichts mehr bei raus.
Ich hab mal die fla und xml im anhang. irgendwie find ich den fehler nicht^^ bin einfach zu blöd :D
 

Anhänge

  • xml.zip
    6,4 KB · Aufrufe: 12
Hi,

entweder hast Du eine fehlerhafte Version von parseET gefunden (dann nenne mir bitte das Posting, damit ich es korrigieren kann), oder beim Abschreiben Fehler gemacht. Du hast in der Liste der Entitäten zweimal "lt" stehen und bei drei Entitäten das Semikolon vergessen. Probiers so:
Code:
function parseET(obj) {
    var str = obj.toString();
    var et = new Array('&quot;', '&lt;', '&gt;', '&amp;', chr(10));
    var sg = new Array('"', '<', '>', '&', '');
    for (var i=0; i<et.length; i++) {
         str = str.split(et[i]).join(sg[i]);
    }
    return str;
}

Gruß
.
 
Zurück