XML-Attribute lassen sich beim Namen nennen
Raoul Keller
- javascript
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).
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
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>
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
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.
@@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'
Hallo Gunnar,
der Prolog hat wirklich gefehlt. Ich habe ihn nachträglich hinzugefügt, was leider auch keine Änderung erbracht hat.
Gruß
Raoul Keller
@@Raoul Keller:
nuqneH
der Prolog hat wirklich gefehlt.
Ich habe ihn nachträglich hinzugefügt
Nicht falsch, aber unnötig.
was leider auch keine Änderung erbracht hat.
Siehste.
Qapla'
Gelöst!
xml.getElementsByTagName('branch')[0].getAttribute('size');
funktioniert doch. Ich muss beim Testen irgendeinen Fehler gemacht haben.
Gruß
Raoul Keller