Professionelle Bücher. Auch für Einsteiger.

Inhaltsverzeichnis
1 Einleitung
2 Webbrowser
3 JavaScript einbauen
4 Programmieren mit JavaScript
5 Datum
6 Zufall
7 Browserinformationen
8 Fenster
9 Formulare
10 Frames und Iframes
11 Grafiken
12 Cookies
13 Objekte und Arrays
14 Ereignisbehandlung
15 Fehlerbehandlung
16 DOM
17 DHTML und CSS
18 AJAX
19 XML
20 Web Services
21 AJAX-Frameworks
22 Plugins
23 Multimedia
24 Java
25 Serverseitige Technologien
26 JavaScript goes .NET
27 Code schützen
28 Top Secret: Passwortschutz
29 Signierte Skripte
30 JavaScript und Sicherheit
31 Navigation
32 Warenkorb
33 JavaScript-Bibliotheken
34 Referenz
35 Quellen im Web
36 Die Zukunft von JavaScript
Index
Download: - ZIP, ca. 9,2 MB
Buch bestellen
Ihre Meinung?
<< zurück | Galileo Computing / <openbook> / JavaScript und AJAX | vor >>
JavaScript und AJAX von Christian Wenz Das umfassende Handbuch
JavaScript und AJAX 839 S., mit DVD, 39,90 Euro Galileo Computing ISBN 3-89842-859-1 |
| Kapitel 19 XML
|  | 19.1 XML
|  |  | 19.1.1 XML-Daten verarbeiten
|  |  | 19.1.2 XML-Dokumente erstellen
|  | 19.2 XSL
|  | 19.3 XPath
## 19.3 XPath Das letzte XML-Feature, das in JavaScript unterstützt wird, ist XPath. Hier sind die Browserunterschiede noch erheblicher als zuvor bei XML und XSL(T). Erneut beginnen wir mit dem Internet Explorer, denn dort geht es dieses Mal sehr einfach. Mit selectSingleNode() können Sie einen einzelnen Knoten via XPath-Abfrage auswählen; selectNodes() liefert mehrere Knoten zurück. Diese beiden Methoden sind von jedem Knoten eines XML-Dokuments aus zu erreichen. Im Mozilla-Browser ist der Ansatz grundverschieden, etwas mächtiger, aber auch etwas komplizierter in der Anwendung. Es gibt ein eigenes XPath-Objekt namens XPathEvaluator, das XPath-Abfragen ausführen kann. Dessen Methode evaluate() führt eine XPath-Abfrage aus und erwartet die folgenden Parameter:
1. | den XPath-Ausdruck
2. | den Knoten, von dem aus der Ausdruck ausgewertet werden soll
3. | null
4. | den Rückgabewert: XPathResult.ANY_TYPE ist der Standardwert, Sie können aber auch XPathResult.FIRST_ORDERED_NODE_TYPE (nur ein Knoten) oder XPathResult.ORDERED_NODE_ITERATOR_TYPE (ein Iterator, dessen Methode iterateNext() von Knoten zu Knoten springt) angeben.
5. | null
Noch ein Hinweis zu den Rückgabewerten: Wenn nur ein Knoten zurückgeliefert wird, benötigen Sie die Eigenschaft singleNodeValue der Rückgabe von evaluate(), um auf den Knoten zuzugreifen. Beim Iterator sieht eine Schleife zur Abfrage aller Knoten wie folgt aus:
    while (knoten = iterator.iterateNext()) {
       // "knoten" ist der aktuelle XML-Knoten
    }
Als Beispiel für die Implementierung wird (wieder einmal) ein altes Beispiel umgeschrieben, um die Verwendung von XPath im Kontext zu zeigen. Am Anfang des Kapitels wurde die XML-Rückgabe vom Server analysiert; dazu hat getElementsByTagName() eine Liste von <link>-Elementen zurückgeliefert. Dieser Methodenaufruf soll jetzt durch XPath ersetzt werden. Das ist zwar im vorliegenden Fall nicht die einfachste Lösung, zeigt aber, wie sich XPath via JavaScript integrieren lässt. Nachfolgend sehen Sie das komplette Listing; der XPath-Code ist halbfett hervorgehoben:
    <html>
    <head>
    <title>AJAX</title>
    <script type="text/javascript"><!--
    var http = null;
    if (window.XMLHttpRequest) {
       http = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
       http = new ActiveXObject("Microsoft.XMLHTTP");
    }

    window.onload = function() {
       if (http != null) {
          http.open("GET", "links.xml", true);
          http.onreadystatechange = ausgeben;
          http.send(null);
       }
    }

    function ausgeben() {
       if (http.readyState == 4) {
          var liste = document.getElementById("Liste");
          var daten = http.responseXML;
          // alt: var ergebnisse = xml.getElementsByTagName("link");
          var ergebnisse = [];
          if (window.ActiveXObject) {
             ergebnisse = daten.documentElement.selectNodes("link");
          } else if (window.XPathEvaluator) {
             var ev = new XPathEvaluator();
             var iterator = ev.evaluate(
                "link",
                daten.documentElement,
                null,
                XPathResult.ORDERED_NODE_ITERATOR_TYPE,
                null);
             var knoten;
             while (knoten = iterator.iterateNext()) {
                ergebnisse[ergebnisse.length] = knoten;
             }
          }

          for (var i = 0; i < ergebnisse.length; i++) {
             var name, url;
             var datum = ergebnisse[i];
             for (var j = 0; j < datum.childNodes.length; j++) {
                with (datum.childNodes[j]) {
                   if (nodeName == "text") {
                      name = firstChild.nodeValue;
                   } else if (nodeName == "url") {
                      url = firstChild.nodeValue;
                   }
                }
             }

             var li = document.createElement("li");
             var a = document.createElement("a");
             a.setAttribute("href", url);
             var txt = document.createTextNode(name);
             a.appendChild(txt);
             li.appendChild(a);
             liste.appendChild(li);
          }
       }
    }
    //--></script>
    </head>
    <body>
    <ul id="Liste"></ul>
    </body>
    </html>
So viel also zum Zugriff auf mehrere Knoten auf einmal. Zum Abschluss soll noch gezeigt werden, wie Sie auf einen einzelnen Knoten zugreifen. Zur Erinnerung: Im Internet Explorer verwenden Sie die Methode select-SingleNode(), im Mozilla den Rückgabetyp XPathResult.FIRST_ OR-DERED_NODE_TYPE gepaart mit der Eigenschaft single-NodeValue. Als Beispiel muss wieder die Generierung der Aufzählungsliste herhalten. Diesmal wird das Iterieren durch die Kindknoten von <link> durch eine XPath-Abfrage ersetzt. Wie üblich sind die Änderungen halbfett hervorgehoben.
    <html>
    <head>
    <title>AJAX</title>
    <script type="text/javascript"><!--
    var http = null;
    if (window.XMLHttpRequest) {
       http = new XMLHttpRequest();
    } else if (window.ActiveXObject) {
       http = new ActiveXObject("Microsoft.XMLHTTP");
    }

    window.onload = function() {
       if (http != null) {
          http.open("GET", "links.xml", true);
          http.onreadystatechange = ausgeben;
          http.send(null);
       }
    }

    function ausgeben() {
       if (http.readyState == 4) {
          var liste = document.getElementById("Liste");
          var daten = http.responseXML;
          // alt: var ergebnisse = xml.getElementsByTagName("link");
          var ergebnisse = [];
          if (window.ActiveXObject) {
             ergebnisse = daten.documentElement.selectNodes("link");
          } else if (window.XPathEvaluator) {
             var ev = new XPathEvaluator();
             var iterator = ev.evaluate(
                "link",
                daten.documentElement,
                null,
                XPathResult.ORDERED_NODE_ITERATOR_TYPE,
                null);
             var knoten;
             while (knoten = iterator.iterateNext()) {
                ergebnisse[ergebnisse.length] = knoten;
             }
          }

          for (var i = 0; i < ergebnisse.length; i++) {
             var name, url;
             var datum = ergebnisse[i];
             if (window.ActiveXObject) {
                name = datum.selectSingleNode("text").firstChild.nodeValue;
                url = datum.selectSingleNode("url").firstChild.nodeValue;
             } else if (window.XPathEvaluator) {
                var ev = new XPathEvaluator();
                var ergebnis1 = ev.evaluate(
                   "text",
                   datum,
                   null,
                   XPathResult.FIRST_ORDERED_NODE_TYPE,
                   null);
                name = ergebnis1.singleNodeValue.firstChild.nodeValue;
                var ergebnis2 = ev.evaluate(
                   "url",
                   datum,
                   null,
                   XPathResult.FIRST_ORDERED_NODE_TYPE,
                   null);
                url = ergebnis2.singleNodeValue.firstChild.nodeValue;
             }

             var li = document.createElement("li");
             var a = document.createElement("a");
             a.setAttribute("href", url);
             var txt = document.createTextNode(name);
             a.appendChild(txt);
             li.appendChild(a);
             liste.appendChild(li);
          }
       }
    }
    //--></script>
    </head>

    <body>
    <ul id="Liste"></ul>
    </body>
    </html>
In diesem Kapitel haben Sie gesehen, welche fortschrittlichen Möglichkeiten JavaScript in Bezug auf XML bietet. Dennoch: Bei einigen Features wie XSLT und XPath müssen Sie einige Umwege gehen, um zumindest Internet Explorer, Mozilla und Opera zu unterstützen – Konqueror und Safari bleiben dort außen vor. Wenn Sie XSLT und/oder XPath benötigen und trotzdem Konqueror und Safari unterstützen möchten, hilft Ihnen möglicherweise die Bibliothek AJAXSLT von Google, die unter http://google-ajaxslt.sourceforge.net/ verfügbar ist. Dieses Projekt hat es sich zum Ziel gesetzt, diverse XML-Features für möglichst viele Browser zur Verfügung zu stellen. Werfen Sie einen Blick darauf!
<< zurück | <top> | vor >>
Zum Katalog
JavaScript und AJAX bestellen
Ihre Meinung?
Wie hat Ihnen das <openbook> gefallen? Ihre Meinung
Buchtipps
| JavaScript und AJAX - Das Video-Training
| Webseiten programmieren und gestalten
| XHTML, HTML und CSS
| CSS-Praxis
| AJAX
| PHP 5 und MySQL 5
| TYPO3 4.0
Shopping
Versandkostenfrei bestellen in Deutschland und Österreich Info

Copyright © Galileo Press 2007
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das <openbook> denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt. Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.

[Galileo Computing]
Galileo Press, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, info@galileo-press.de