JavaScript und XML – Verarbeitung von XML-Dateien

XML eignet sich hervorragend zur Übertragung von Datenstrukturen, die in ein HTML-Dokument eingebaut werden müssen. Aufgrund des strukturellen Aufbaus kann mit Hilfe von JavaScript und seinen DOM-Fähigkeiten leicht auf die in einem XML-Dokument enthaltenen Daten zugegriffen werden. Diese XML-Dateien können mit Ajax vom Webserver abgerufen werden.

Dabei ist es egal, ob die Daten als normale XML-Datei auf dem Server gespeichert sind oder per – beispielsweise in PHP geschriebenem – Script dynamisch auf Basis des Datenmaterials einer Datenbank erzeugt wird. Die auf diese Weise realisierbaren Web-Services können äußerst komplex sein und dennoch effektiv, da derart realisierte Services den Webserver erheblich entlasten können. So muss der Webserver nicht jedesmal die gesamte Seite ausliefern – die zu übertragenden Daten beschränken sich ausschliesslich auf den Teil, der in Form von Nutzdaten vom Web-Service erzeugt wird. Auch ist die Auslagerung durch Trennung des Web-Service vom eigentlichen Webserver sehr leicht realisierbar.

JavaScript XML Beispiel: XML-Dateien einbauen mit Ajax, JavaScript & XML

Das nun folgende Beispiel nutzt Ajax zur asynchronen Übertragung einer XML-Datei, die auf dem Webserver gespeichert ist und als Script unterhalb dieses Absatzes angezeigt wird. Nach der Übertragung der Nutzdaten, die in der Datei testdatei2.xml gespeichert sind, werden diese Daten, die im XML-Format vorliegen in das geöffnete HMTL-Dokument eingefügt. Diese Aufgabe übernimmt die Funktion mit dem Namen xml_daten_ausgeben.

<?xml version="1.0" encoding="UTF-8" ?>
<personen>
  <person name="Wilhelm" alter="52">
    <info>Mann von Elisabet, Schwiegervater von Katarina und Vater von Karl!</info>
  </person>
  <person name="Karl" alter="34">
    <info>Verheiratet mit Katarina und Sohn von Wilhelm und Elisabet!</info>
  </person>
  <person name="Katarina" alter="32">
    <info>Frau von Karl, Schwiegertochter von Wilhelm und Elisabet!</info>
  </person>
  <person name="Elisabet" alter="62">
    <info>Ehefrau von Wilhelm, sowie Mutter von Karl und Schwiegermutter von Katarina!</info>
  </person>
</personen>

Zum Erzeugen von HTML-Elementen und Textknoten werden die Methoden createElement bzw. createTextNode genutzt. Auch zum Einhängen der XML-Daten in den HTML-Dokumentenbaum wird auf Methoden des JavaScript-Objekts Document zurückgegriffen. So hängt die Methode appendChild einen Knoten (Text- oder Elementknoten) an einen anderen. Im Beispiel wird per DOM eine Tabelle erzeugt, in welche die Daten des XML-Dokuments eingetragen werden. Der besseren Übersicht halber werden mit dem JavaScript Style-Objekt die CSS-Eigenschaften der Kopfzeile der Tabelle fett formatiert.

Die Methode getElementsByTagName liefert alle Elemente der in der Variablen response gespeicherten XML-Datensätze, die unter Tags mit dem Tag-Namen person gespeichert sind. Sie liefert ein Array mit den enthaltenen Datensätzen, die dann weiter verarbeitet werden. Mit der For-Schleife wird jeder einzelne Eintrag durchgegangen. GetAttribute entnimmt dem jeweiligen Datensatz die Attribute name und alter, während der Inhalt des Kindelements mit dem Namen info wiederum per getElementsByTagName ermittelt wird. Diese Daten werden dann in Form einzelner Tabellenzeilen in die Tabelle eingefügt. Am Ende der Funktion wird die so erzeugte Tabelle als Kindelement an das HTML-Element mit der ID ausgabeelement angehängt. Der dazu benötigte Verweis auf das Ausgabeelement – das SPAN-Tag zu Beginn des Quellcodes – wird durch die Methode getElementById() ermittelt.

<span id="ausgabeelement"></span>
<script language="javascript" type="text/javascript">
<!-- // JavaScript-Bereich für ältere Browser auskommentieren
// Wenn es sich bei dem vom Benutzer verwendeten Browser
// um einen Internet Explorer handelt, wird das Request-Objekt
// per ActiveX geholt, oder ansonsten vom JavaScript Window-Objekt.
var httpRequestObject = (navigator.appName == "Microsoft Internet Explorer") ? 
      new ActiveXObject ("Microsoft.XMLHTTP") : new XMLHttpRequest ();
// Verbindung per GET öffnen und die XML-Datei abrufen.
httpRequestObject.open ('GET', 'testdatei2.xml');
// Event-Handler-Funktion handleReadyStateChange mit dem readystatechange-Event
// verbinden. Diese Funktion wird immer dann ausgeführt, wenn sich
// der Status der Abfrage ändert.
httpRequestObject.onreadystatechange = handleReadyStateChange;
// Als nächstes wird die Anfrage an den Server gesendet.
httpRequestObject.send (null);

// Event-Handler, der aufgerufen wird, wenn Statusänderungen beim Request-Objekt auftreten
function handleReadyStateChange () {
  // Request abgeschlossen (readyState 4) und Server mit OK (Status 200) geantwortet?
  // Bei allen anderen Statusänderungen wird die Funktion zwar aufgerufen, aber
  // es wird nicht auf die Stati reagiert.
  if (httpRequestObject.readyState == 4 && httpRequestObject.status == 200) {
    // Request ist abgeschlossen und alle Daten sind angekommen
    // => Empfangene XML-Daten im Ausgabeelement ausgeben
    xml_daten_ausgeben (httpRequestObject.responseXML);
  }
}

// Funktion zur formatierten Ausgabe der empfangenen Daten
function xml_daten_ausgeben (response) {
  // Neues HTML-Element vom Typ Table erzeugen
  var t = document.createElement ('table');
  // Tabellenzeile für die Spaltenüberschriften erzeugen
  var tr = document.createElement ('tr');
  // Überschriften Fett ausgeben
  tr.style.fontWeight = 'bold';
  // Spalten für die Tabellenüberschriften generieren
  var td = document.createElement ('td');
  // Textknoten mit der Überschrift in die Spalte einfügen
  td.appendChild (document.createTextNode ('Name'));
  // und das Spaltenelement in die Tabellenzeile einhängen.
  tr.appendChild (td);
  // Knoten klonen, Text darin ändern und den geklonten Knoten
  // einfügen (zweimal mit veränderter Überschrift).
  td = td.cloneNode (true);
  td.firstChild.nodeValue = 'Alter';
  tr.appendChild (td);
  td = td.cloneNode (true);
  td.firstChild.nodeValue = 'Info';
  tr.appendChild (td);
  // Tabellenzeile mit den Überschriften in Tabelle einhängen.
  t.appendChild (tr);

  // Elemente aus der XML-Datei ermitteln, die unter dem Tagnamen
  // person gespeichert sind.
  var personen = response.getElementsByTagName ('person');
  // Alle gefundenen Elemente nacheinander abarbeiten.
  for (var i = 0; i < personen.length; i++) {
    // Jedes gefundene Element in einer eigenen Tabellenzeile darstellen
    tr = document.createElement ('tr');
    td = td.cloneNode (true);
    // Attribut name des Datensatzes auslesen und in der ersten
    // Tabellenspalte ausgeben.
    td.firstChild.nodeValue = personen[i].getAttribute ('name');
    tr.appendChild (td);
    td = td.cloneNode (true);
    // In die zweite Spalte kommt das Attribut alter
    td.firstChild.nodeValue = personen[i].getAttribute ('alter');
    tr.appendChild (td);
    td = td.cloneNode (true);
    // Die dritte Spalte wird mit dem Inhalt des Kindelements info gefüllt.
    td.firstChild.nodeValue = personen[i].getElementsByTagName ('info')[0].firstChild.nodeValue;
    tr.appendChild (td);
    // Neue Tabellenzeile in die Tabelle einfügen.
    t.appendChild (tr);
  }
  // Tabelle als Kindelement an das SPAN-Element anhängen
  document.getElementById ('ausgabeelement').appendChild (t);
}
// -->
</script>

Letzte Posts aus unserem Forum

Script Schrift vergrößern

Hallo wollte gerade das Script für die Schriftvergrößerung testen, aber irgendwie bekomme ich das nicht hin. Habe eine Joomla Website und dort die ... » mehr

von Gast am Donnerstag, 22. April 2010 13:32 in JavaScript - bisher 1 Antwort
Letzter Beitrag: Donnerstag, 22. April 2010 18:05 von alm

Hallo, damit kann man nicht allzu viel anfangen. Soviel ich weiss kann es zuweilen Probleme mit Tabellen-Layouts geben. Dort werden die ... » mehr

Javascript Schriftengröße: Problem bei URL-Übergabe im IE8

Hallo, ich hab eben das Javascript zur Schriftengröße eingebaut, klappt auch wunderbar auf Firefox, aber der IE 8 hat folgendes Problem: - wenn ich ... » mehr

von horst1234 am Dienstag, 23. Februar 2010 13:06 in JavaScript - bisher 1 Antwort
Letzter Beitrag: Dienstag, 23. Februar 2010 14:07 von horst1234

Ich hab das charset im Header geändert (wie in der beispiel.html), und schon klappt es ... » mehr

Dynamisches einfügen von Zeilen in eine Spalte

Hallo, ich möchte gerne eine Zeile zwischen zwei andere Zeilen einfügen. Leider klappt folgender Versuch noch nicht so richtig. Vielleicht kann mir ... » mehr

von Bluecaspar am Mittwoch, 10. Februar 2010 18:09 in JavaScript - bisher 2 Antworten
Letzter Beitrag: Donnerstag, 11. Februar 2010 10:37 von Bluecaspar

Ja genau, das war der Fehler. Vielen Dank Alex. Hier der korrigierte Code: <html> <head> <title> Test ... » mehr

Fenster in Frame erzeugen

Hallo, ich würde gerne ein Fenster in einer Webseite erzeugen. Das Fenster sollte dabei auf ein Frame begrenzt sein, sich also nicht aus diesen ... » mehr

von Bluecaspar am Dienstag, 9. Februar 2010 13:57 in JavaScript - bisher 2 Antworten
Letzter Beitrag: Mittwoch, 10. Februar 2010 09:32 von Bluecaspar

Ja hervorragend, dass ist genau das was ich möchte. Danke ... » mehr

Problem: Kombination mit Lightbox 2

Hallo, ich bin gerade dabei die Galerie mit der Lightbox 2 zu verknüpfen, da ich die Bilder im Vollformat gerne in diesem schicken aufpoppenden ... » mehr

von GoPeter am Montag, 16. November 2009 23:38 in JavaScript - bisher 16 Antworten
Letzter Beitrag: Mittwoch, 18. November 2009 00:32 von GoPeter

Soo...hat lange gedauert...aber jetzt ist es endlich ... » mehr



¬ Insolvenzrecht