Datei auslesen

M

mitti

Mitglied
Thread Starter
Dabei seit
15.11.2004
Beiträge
27
Reaktionspunkte
0
Gut ich hatte schon ein Problem mit httpRequest, die sehr gut hier beantwortet wurde. Danke nochmal.

Ich hoffe, diesmal kann auch jemand mir helfen :eek:

Jetzt bekomme ich meine responseXML zurück. Ich stelle erstmals als responseText. Di Frage ist:

wie kann ich eninge Daten von Datei auslesen und in einer Tabelle oder Div auflisten.

Beispiel.

<text>
<modell>AUDI</modell>
<jahr>1989</jahr>
<braucheIchNicht>vvvvvv</braucheIchNicht>
</text>
<text>
<modell>OPEL</modell>
<jahr>2001</jahr>
<braucheIchNicht>vvvvvv</braucheIchNicht>
</text>
<text>
<modell>FORD</modell>
<jahr>1990</jahr>
<braucheIchNicht>vvvvv</braucheIchNicht>
</text>


Wie konnte ich die Daten die ich brauche auslesen und als tabelle darstellen?

AUDI 1989
OPEL 2001
FORD 1990


Gut, das habe ich schon herausgefunden:

var i, n_elems, elems = req.responseXML.getElementsByTagName("modell");
n_elems = elems.length;
for (i = 0; i < n_elems; i++)
document.write(elems.firstChild.nodeValue + "<br>");

Aber wie stelle ich das wie ich möchte? Und zum Beispiel ein Link darauf machen?

Vielen Dank für Eure Hilfe
 
Zuletzt bearbeitet:
mitti schrieb:
var i, n_elems, elems = req.responseXML.getElementsByTagName("modell");
n_elems = elems.length;
for (i = 0; i < n_elems; i++)
document.write(elems.firstChild.nodeValue + "<br>");

Aber wie stelle ich das wie ich möchte? Und zum Beispiel ein Link darauf machen?


Einfach die entsprechenden Tags mit ausgeben, für eine Tabelle also z.B.
Code:
var elems = req.responseXML.getElementsByTagName("modell");
var n_ elems = elems.length;
document.write("<table>");
for (var i = 0; i < n_ elems; i++)
{
  document.write("<tr>");
      document.write("<td>" + elems[i].firstChild.nodeValue + "</td>");
  document.write("</tr>");
}
document.write("</table>");
 
Danke für die Antwort. Das ist schon mal gut, Deine Erklärung, aber wie sage ich, diese Daten sollen in ein Div-Tag und nicht das ganze Dokument ersetzen?
Ich habe nähmlich eine Seite mit Divs und in einem möchte ich gerne diese response darstellen.

Ich hoffe, Du kannst mir weiterhelfen

Danke
 
mitti schrieb:
Danke für die Antwort. Das ist schon mal gut, Deine Erklärung, aber wie sage ich, diese Daten sollen in ein Div-Tag und nicht das ganze Dokument ersetzen?
Ich habe nähmlich eine Seite mit Divs und in einem möchte ich gerne diese response darstellen.

Jau, das hat nbei mir auch eine Weile gedauert ...

Du hast in deinem HTML ein (leeres) div mit id, also z.B.
Code:
<div id="hier"></div>
.
Dann kannst du den Inhalt des divs als String zusammenbasteln und als innerHTML des divs setzen, z.B.
Code:
var elems = req.responseXML.getElementsByTagName("modell");
var n_ elems = elems.length;
var hier = "<table>";
for (var i = 0; i < n_ elems; i++)
{
  hier =+ "<tr>";
  hier =+ "<td>" + elems[i].firstChild.nodeValue + "</td>";
  hier =+ "</tr>";
}
hier =+ "</table>";
document.getElementById('hier').innerHTML = hier;
Und schon hast du was du brauchst.

Helge
 
Kein Problem, es ist nicht schlimm, wenn es lange dauert. Und noch weniger, wenn man gute Hilfe bekommt. Ich werde es gleich probieren aber ich glaube, dass wie Du das beschrieben hast, muss auf jedem Fall gehen.

Danke für Deine Zeit und Hilfe. Ich melde mich wieder hoffentlich mit guten Nachrinten :D

Bis dann
 
uhmmmm :(

ich bekomme NaN


ok, mein Fehler, schon erledigt
 
Zuletzt bearbeitet:
mitti schrieb:
Kein Problem, es ist nicht schlimm, wenn es lange dauert.
Damit meinte ich, dass ich auch eine Weile gesucht habe. Zuerst habe ich immer innerText verwendet, aber da wird kein HTML interpretiert :(
Aber wozu gibt es das wunderbare SelfHTML!

Ciao
Helge
 
Wie wärs mit XSLT Stylesheets?
 
Hallo,

also wie gesagt, es funktioniert sehr gut. Ich habe abe noch eine kleine Frage, falls ich sie stellen darf.
:eek:
Da werden mehrere td erzeugt, je machdem wieviele einträge es gibt. Wie konnte ich für jede td eine andere id erstellen? oder besser erklärt. Ich habe von jedem td einen link gemacht und auch als input die Jahreswerte von xmlresponde abgeholt. Wenn ich auf das Automodell klicke sollte das Jahr mit einem alert erscheinen.

Kannst Du vielleicht irgendwie helfen?

danke
 
mitti schrieb:
Da werden mehrere td erzeugt, je machdem wieviele einträge es gibt. Wie konnte ich für jede td eine andere id erstellen?

Einfach z.B. mit dem Zähler (dem i) einen entsprechenden String basteln:
Code:
hier =+ "<td id='modell_" + i + "'>";
Man beachte die einfachen und doppelten Anführungszeichen!

oder besser erklärt. Ich habe von jedem td einen link gemacht und auch als input die Jahreswerte von xmlresponde abgeholt. Wenn ich auf das Automodell klicke sollte das Jahr mit einem alert erscheinen.

Das Jahr würde ich gleich mit in die Tabelle schreiben ...
Aber den Alert kannst du natürlich auch erzeugen, falls die Indices von Modell und Jahr gleich sind: Einfach eine Alert-Funktion schreiben, die als Input den Index erhält und entsprechend den Eintrag für das Jahr nehmen:
Code:
req.responseXML.getElementsByTagName("jahr")[i].firstChild.nodeValue
, wobei das i natürlich der Index des Modells ist.

Du kannst auch das Jahr als title-Tag setzen, dann erscheint es, wenn du mit der Maus drüber gehst.

Generell wäre es am einfachsten, wenn du erstmal die Tabelle etc. mit ein paar Beipsieldaten von Hand erzeugst und solange umbaust, bis sie so aussieht und reagiert, wie du möchtest. Anschließend machst du dich dann an die automatische Erzeugung. Ist meist einfacher, als alles auf einmal zu machen.

Ciao
Helge
 
Vielen Dank für Deine Hilfe, es ist wirklich schön, wenn man nicht weiterkommt, ein bisschen (viel) Hilfe zu bekommen.

Danke nochmal ;)


Hallo, ich habe gerade gesehen, dass ich das anders gemacht habe. Also es ist nut ein TD und die Modelle werden nur mit br als Liste dargestellt. Dazu habe ich ein input type hidden mit den Jahren, wie du oben gemacht hast.
Als value dieses input -req.responseXML.getElementsByTagName("jahr").firstChild.nodeValue- und id='modell_" + i + "'

Aber irgendwie kriege ich nicht hin, dass jedes Modell das eigene Jahr weitergibt.
 
Zuletzt bearbeitet:
mitti schrieb:
Hallo, ich habe gerade gesehen, dass ich das anders gemacht habe. Also es ist nut ein TD und die Modelle werden nur mit br als Liste dargestellt. Dazu habe ich ein input type hidden mit den Jahren, wie du oben gemacht hast.
Als value dieses input -req.responseXML.getElementsByTagName("jahr").firstChild.nodeValue- und id='modell_" + i + "'


Würde ich nicht machen, ein wenig Rücksicht auf die logische Struktur ist schon sinnvoll.
Wenn du eine Tabelle haben willst, nimm table mit tr und entsprechenden td, wenn du nur eine Liste haben willst, nimm ul und li, aber bitte nicht einfach einen Text, dem mit br Zeilenumbrüche beigebogen sind.
Die Optik kannst du mit CSS immer passend hinbekommen.

Aber irgendwie kriege ich nicht hin, dass jedes Modell das eigene Jahr weitergibt.

Ein input type hidden wird ja auch nicht angezeigt ...

Poste doch mal ein größeres Stück des gewünschten Codes, dann können wir den in Grund und Boden kritisieren und anschließend was Nettes draus machen :)

Das ganze mit zwei Aufrufen (einmal "modell" und einmal "jahr") ist auch ein wenig gefährlich, denn nirgendwo ist garantiert, dass die Nummer 1 der einen Liste auch die 1 der anderen Liste ist. Eigentlich müßte man nach Tag "text" aufteilen und dann darin entsprechend "modell" und "jahr" holen.

Ciao
Helge
 
Mehr oder weniger so.

Ich habe nicht sooo viel Ahnung aber ich versuche es einfach:rolleyes:

var results ="<div style='background-color:#0A0D6F; height:124px; width:300px; overflow:auto'><table><tr><td>";
if (req.readyState==4) {
if (req.status==200) {
var elements =req.responseXML.getElementsByTagName("modell");
var jahr =req.responseXML.getElementsByTagName("jahr");
var n_elements =elements.length;
if (n_elements>1){
for (var i= 0;i<n_elements;i++)
{
results =results+"<a href='#'>"+elements.firstChild.nodeValue+"</a>"+"<input id='jahr_"+ i + "' size='6' value='"+jahr.firstChild.nodeValue+"'>"+"<br>";
}
results =results+"</td></tr></table></div>";

danach muss ich irgendwie, wenn ich auf OPEL anklicke, die entpreschende id bzw. value zugreifen können.
 
mitti schrieb:
Mehr oder weniger so.

Code:
var results   ="<div style='background-color:#0A0D6F; height:124px; width:300px; overflow:auto'><table><tr><td>";       
    if (req.readyState==4) {
      if (req.status==200) {
      var elements   =req.responseXML.getElementsByTagName("modell");
      var jahr       =req.responseXML.getElementsByTagName("jahr");
      var n_elements =elements.length;
        if (n_elements>1){
          for (var i= 0;i<n_elements;i++)
          {
            results =results+"<a href='#'>"+elements[i].firstChild.nodeValue+"</a>"+"<input id='jahr_"+ i + "' size='6' value='"+jahr[i].firstChild.nodeValue+"'>"+"<br>";
          }
          results =results+"</td></tr></table></div>";
danach muss ich irgendwie, wenn ich auf OPEL anklicke, die entpreschende id bzw. value zugreifen können.

Jau, dann schauen wir mal ...

Rauskommen soll also sowas:
Code:
<div id='modelle'>
<ul>
<li>OPEL</li>
<li>FORD</li>
</ul>
</div>

Und bei Klick auf den Namen dann ein Alert mit der Jahreszahl?

Dann müssen wir einen entsprechenden Eventhandler registrieren:
Code:
<div id='modelle'>
<ul>
<li onclick='alert("1998")'>OPEL</li>
<li onclick='alert("2001")'>FORD</li>
</ul>
</div>

Wenn der Eventhandler komplizierter wird, müssen wir eine eigene Funktion basteln, aber für einen einfachen Alert reicht es so.

Also haben wir für das JavaScript:
Code:
var liste ="<ul>";       
if ((req.readyState==4) && (req.status==200)) {
  var modell = req.responseXML.getElementsByTagName("modell");
  var jahr     = req.responseXML.getElementsByTagName("jahr");
  var n_modell = modell.length;
  for (var i=0;i<n_modell;i++)
  {
     liste = liste + "<li onclick='alert("+ jahr[i].firstChild.nodeValue + ")'>"+modell[i].firstChild.nodeValue + "</li>";
  }
}
liste =liste + "</ul>";
document.getElementById("modelle").innerHTML = liste;

Oder besser mit dem Zusammenhalt von Modell und Jahr (allerdings ungetestet, die XML-Hierarchie muss noch nicht stimmen ...):
Code:
var liste ="<ul>";       
if ((req.readyState==4) && (req.status==200)) {
  var Element = req.responseXML.getElementsByTagName("text");
  var n_Element = Element.length;
  for (var i=0;i<n_Element;i++)
  {
    var modell = Element[i].getElementsByTagName("modell");
    var jahr     = Element[i].getElementsByTagName("jahr");
     liste = liste + "<li onclick='alert("+ jahr[0].firstChild.nodeValue + ")'>"+modell[0].firstChild.nodeValue + "</li>";
  }
}
liste =liste + "</ul>";
document.getElementById("modelle").innerHTML = liste;

Aber wie gesagt, ich würde die Jahreszahl in ein title-Attribut packen, dann erscheint sie, wenn man mit der Maus drübergeht. Oder gleich mit in eine Tabelle schreiben. Ein Alert ist so brutal ;)

Aber vielleicht schreibst du auch mal, was der Gesamt-Zusammenhang ist, also was das Widget eigentlich machen soll, dann kann man entscheiden, was die benutzbarste Lösung sein müsste.

Ciao
Helge
 
Du bist ja klasse!!

Danke, jetzt habe ich nicht viel Zeit. Ich werden morgen weitermachen. Aber erstmal vielen, vielen Dank für Deine Zeit und Hilfe.

Mitti
 
mitti schrieb:
Du bist ja klasse!!

Danke, jetzt habe ich nicht viel Zeit. Ich werden morgen weitermachen. Aber erstmal vielen, vielen Dank für Deine Zeit und Hilfe.

Mitti

Da nich für, hab' gerade selbst mein erste Widget so gut wie fertig, und beim Erklären lernt man selbst am meisten :D

Ciao
Helge
 
Zurück
Oben Unten