Raoul Keller: XML-Attribute lassen sich beim Namen nennen

Hallo alle miteinander,

ich habe ein Problem, für das es sicher eine ganz simple Erklärung gibt. Sie will mir einfach nicht einleuchten.

Ich habe einen XML-Baum via Ajax nachgeladen und kann auch über getElementsByTagName problemlos darauf zugreifen. Soweit kein Problem. Wenn ich allerdings versuche die Attribute der Elemente auszulesen kommt immer undefined heraus. Ein Beispiel.

Ich habe ein Tag namens "branch" mit dem Attribut "size".
"undefined" erhalte ich wenn ich folgendes Versuche:

xml.getElementsByTagName('branch')[0].size;

ebenfalls erhalte ich undefined, wenn ich es auf diese Weise versuche

xml.getElementsByTagName('branch')[0].getAttribute('size');

Bei der Fehlersuche habe ich dann folgendes versucht, was mich nun gänzlich verwirrt. Wenn ich nämlich

xml.getElementsByTagName('branch')[0].attributes[0].nodeName

abfrage erhalte ich "size";

und auch

xml.getElementsByTagName('branch')[0].attributes[0].nodeValue

liefert den richtigen Wert. In Selfhtml steht, dass man sich auf die Reihenfolge der Knoten nicht verlassen soll, weshalb ich von dieser Abfrage absehen möchte.

Wie kann es aber sein, dass Ich die Attribute mit den richtigen Namen und Werten ausgegeben bekomme, wenn ich sie jedoch mit ihrem Namen ansprechen möchte "undefined" erhalte. Ich bin mit meinem Latein am Ende und hoffe, dass mir jemand helfen kann.

Danke schonmal
  Raoul Keller

P.S.:

Nur der Vollständigkeit halber: Ich habe es auch mit

xml.getElementsByTagName('branch')[0].size.nodeValue

sowie mit

xml.getElementsByTagName('branch')[0].getAttribute('size').nodeValue

versucht. Immer das gleiche. Testbrower waren Firefox (Gecko) und Iron (Webkit).

  1. Hi,

    Ich habe einen XML-Baum via Ajax nachgeladen und kann auch über getElementsByTagName problemlos darauf zugreifen. Soweit kein Problem. Wenn ich allerdings versuche die Attribute der Elemente auszulesen kommt immer undefined heraus. Ein Beispiel.

    Ich habe ein Tag namens "branch" mit dem Attribut "size".

    Zeig mal, wie genau das aussieht.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Das Ganze befindet sich auch unter http://inculta.net/gurumi
      So funktioniert es jetzt ja auch (außer im absichtlich ausgesparten IE), aber eben nicht über den Attributnamen sondern nur über den Attributes-Array.

      Javasctipt-Datei:
      ---------------------------------------------------------------------

        
      var drawTree =  
      	{  
      	canvas: false,  
      	context: false,  
      	init: function(canvasID)  
      		{  
      		drawTree.canvas = document.getElementById(canvasID);  
      		drawTree.context = drawTree.canvas.getContext('2d');  
      		},  
      	loadXML: function(uri)  
      		{  
      		var request, content;  
      		request = new XMLHttpRequest();  
      		request.open("GET", uri, true);  
      		request.onreadystatechange = function()  
      			{  
      			if(request.readyState == 4)  
      				{  
      				content = request.responseXML;  
      				drawTree.xmlTree = content;  
        
      				drawTree.createPath();  
      				}  
      			}  
      		request.setRequestHeader('Content-Type','application/x-www-form-urlencoded');  
      		request.send(null);  
      		},  
      	createPath: function()  
      		{  
      		if(typeof drawTree.xmlTree == 'object')  
      			{  
      			var context = drawTree.context;  
      			var xml = drawTree.xmlTree;  
      			var strokes = xml.getElementsByTagName('branch');  
        
      /*			var dump = '';  
      			for(var i = 0; i < strokes[0].attributes.length; i++)  
      				{  
      				dump += strokes[0].attributes[i].nodeName + ': ' + strokes[0].attributes[i].nodeValue + "\n";  
      				}  
      			alert(dump);  
      */  
      			for(var i = 0; i < strokes.length; i++)  
      				{  
      				context.beginPath();  
      				context.lineWidth = strokes[i].attributes[5].nodeValue;  
      				context.moveTo(strokes[i].attributes[1].nodeValue,strokes[i].attributes[2].nodeValue);  
      				context.lineTo(strokes[i].attributes[3].nodeValue,strokes[i].attributes[4].nodeValue);  
      				context.stroke();  
      				}  
      			}  
      		}  
      	}  
        
      window.onload = function()  
      	{  
      	drawTree.init('canvas');  
      	drawTree.loadXML('http://inculta.net/gurumi/tree.php');  
      	}  
        
      
      
        
        
      HTML-Datei  
      -------------------------------------------------------------------  
        
      <html>  
      	<head>  
      		<title>sakura.gurumi</title>  
      		<script type="text/javascript" src="script.js"></script>  
      		<style type="text/css">  
      			canvas  
      				{  
      				border: 2px solid #444444;  
      				}  
      			body  
      				{  
      				background-color: #fffef5;  
      				font: 13px sans-serif;  
      				color: #333333;  
      				text-align: center;  
      				}  
      			#container  
      				{  
      				margin-left: auto;  
      				margin-right: auto;  
      				margin-top: 21px;  
      				text-align: center;  
      				}  
      		</style>  
      	</head>  
      	<body>  
      		<div id="container">  
      			<canvas id="canvas" width="800" height="600"></canvas>  
      		</div>  
      	</body>  
      </html>  
      
      
      1. Hi,

        ich meinte, wie den XML aussieht ...

        drawTree.loadXML('http://inculta.net/gurumi/tree.php');

        Das ist dann also die XML-Ressource, von der du sprichst?

        Abgesehen davon, dass die nicht mal einen XML-Prolog besitzt (wie soll das dann überhaupt XML sein?), sehe ich da kein einziges Attribut namens size.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Oh ja, ich habe mir erlaubt zwischenzeitlich daran weiterzuarbeiten. Da gibt es jetzt kein Attribut "size" mehr. Was ich über "size" geschrieben habe gilt analog auch für "sx", "sy", "ex", "ey" und "thick". Den XML-Prolog habe ich nun hinzugefügt, was allerdings absolut keine Änderung brachte.

        2. @@ChrisB:

          nuqneH

          Das ist dann also die XML-Ressource, von der du sprichst?
          Abgesehen davon, dass die nicht mal einen XML-Prolog besitzt (wie soll das dann überhaupt XML sein?)

          Doch, den besitzt sie:

          [1]  document ::= prolog  element  Misc*

          Der Prolog ist so aufgebaut:

          [22] prolog   ::= XMLDecl? Misc* (doctypedecl  Misc*)?

          Lassen die Fragezeichen irgendwelche Fragen offen? ;-)

          Wie sollte das nicht XML sein, wo der Prolog doch leer sein darf?

          Qapla'

          --
          Volumen einer Pizza mit Radius z und Dicke a: pi z z a
          1. Hallo Gunnar,

            der Prolog hat wirklich gefehlt. Ich habe ihn nachträglich hinzugefügt, was leider auch keine Änderung erbracht hat.

            Gruß
              Raoul Keller

            1. @@Raoul Keller:

              nuqneH

              der Prolog hat wirklich gefehlt.

              Nein.

              Ich habe ihn nachträglich hinzugefügt

              Nicht falsch, aber unnötig.

              was leider auch keine Änderung erbracht hat.

              Siehste.

              Qapla'

              --
              Volumen einer Pizza mit Radius z und Dicke a: pi z z a
  2. Gelöst!

    xml.getElementsByTagName('branch')[0].getAttribute('size');

    funktioniert doch. Ich muss beim Testen irgendeinen Fehler gemacht haben.

    Gruß
      Raoul Keller