Autor: Ma Xiaoning
XML (Extensible Markup Language) mag wie eine Art W3C-Standard aussehen – es hat jetzt keine praktischen Auswirkungen, und selbst wenn es in Zukunft nützlich sein wird, wird es noch lange Zeit später sein. Aber tatsächlich wird es bereits genutzt. Warten Sie also nicht, bis XML zu Ihrem bevorzugten HTML-Editor hinzugefügt wurde, um mit der Verwendung zu beginnen. Es kann jetzt verschiedene interne Probleme und B2B-Systemprobleme lösen.
Bei sparks.com verwenden wir XML, um die Datendarstellung zwischen verschiedenen Systemen zu standardisieren, von Java-Objekten bis hin zu HTML-Datenanzeigen.
Wir haben insbesondere festgestellt, dass Daten einfacher geteilt und bearbeitet werden können, wenn sie in einer sehr einfachen XML-Struktur standardisiert sind. Dabei haben wir viele effektive Möglichkeiten zur Verwendung von XML entdeckt. Im Folgenden wird unsere aktuelle Anwendung im Detail beschrieben.
Standardisieren Erstellen Sie vor der Verwendung von XML ein XML-Datenformat, das sich von den Informationen unterscheidet, die Sie verwenden möchten.
Generieren Sie dynamisches XML
Das Generieren von HTML aus einer Datenbank ist nicht neu, das Generieren von XML jedoch schon. Hier stellen wir die spezifischen Generierungsschritte vor.
Verwendung von XSL als Vorlagensprache
XSL (Extensible Stylesheet Language) ist eine gute Möglichkeit, das XML-Datenanzeigeformat zu definieren, und es ist effektiver, wenn es in mehreren statischen Vorlagen geschrieben wird.
HTML generieren
XML plus XSL entspricht HTML. Das klingt vielleicht nicht richtig, aber unsere HTML-Seite, die Benutzer sehen, ist tatsächlich das Ergebnis von XML und XSL.
1.
Die Fähigkeit zur Standardisierung von XML beruht auf seiner Flexibilität. Aber leider ist es manchmal so flexibel, dass man mit einer leeren Seite zurückbleibt und sich fragt, wie man das Problem lösen kann.
In jedem XML-Projekt besteht der erste Schritt darin, ein Standarddatenformat zu erstellen. Dazu müssen Sie folgende Entscheidungen treffen:
•
• Ob dtd (Dateitypdefinition) verwendet werden soll
und Ermitteln der Daten
verwenden möchten
:
Da es kein Standard-XML-Format gibt, können Entwickler ihre eigenen Formate entwickeln. Wenn Ihr Format jedoch nur von einer Anwendung erkannt wird, können Sie nur diese Anwendung ausführen, um das Format zu verwenden. Es wäre natürlich hilfreicher, wenn es andere Programme gäbe, die Ihr XML-Format ebenfalls lesen könnten. Wenn ein XML-Format geändert wird, muss möglicherweise auch das System, das es verwendet, geändert werden. Daher sollten Sie das Format so vollständig wie möglich erstellen. Da die meisten Systeme Tags ignorieren, die sie nicht erkennen, besteht die sicherste Möglichkeit, das Format einer XML-Datei zu ändern, darin, Tags hinzuzufügen, anstatt sie zu ändern.
Klicken Sie hier, um ein Beispiel für ein XML-Datenformat anzuzeigen.
Bei sparks.com haben wir uns alle Produktdaten angesehen, die für verschiedene Produktpräsentationen erforderlich sind. Obwohl nicht alle Seiten alle Daten verwenden, haben wir ein sehr vollständiges XML-Datenformat entwickelt, das für alle Daten geeignet ist. Auf unserer Produktdetailseite werden beispielsweise mehr Daten angezeigt als auf unserer Produktbrowserseite. Allerdings verwenden wir in beiden Fällen immer noch dasselbe Datenformat, da die XSL-Vorlage jeder Seite nur die Felder verwendet, die sie benötigt.
Ob dtd verwendet werden soll
Bei sparks.com verwenden wir gut organisiertes XML und nicht nur korrektes XML, da ersteres kein DTD erfordert. DTD fügt eine Verarbeitungsebene zwischen dem Klicken des Benutzers und dem Anzeigen der Seite hinzu. Wir fanden, dass diese Ebene zu viel Verarbeitung erforderte. Natürlich ist es immer noch schön, DTDs zu verwenden, wenn man mit anderen Unternehmen im XML-Format kommuniziert. Denn dtd kann sicherstellen, dass die Datenstruktur beim Senden und Empfangen korrekt ist.
Auswählen einer Parsing-Engine Nun gibt es mehrere Parsing-Engines, die verwendet werden können. Für welches Sie sich entscheiden, hängt fast ausschließlich von Ihren Anwendungsanforderungen ab. Wenn Sie sich für die Verwendung von DTD entscheiden, muss die Parsing-Engine in der Lage sein, die Überprüfung Ihres XML durch DTD zu ermöglichen. Sie könnten die Validierung in einem separaten Prozess durchführen, aber das würde sich auf die Leistung auswirken.
Sax und Dom sind zwei grundlegende Parsing-Modelle. SAX ist ereignisbasiert. Wenn also die XML-Datei analysiert wird, werden Ereignisse an die Engine gesendet. Als nächstes werden die Ereignisse mit der Ausgabedatei synchronisiert. Die DOM-Parsing-Engine erstellt eine hierarchische Baumstruktur für dynamische XML-Daten und XSL-Stylesheets. Durch den zufälligen Zugriff auf den DOM-Baum können XML-Daten bereitgestellt werden, als ob sie durch ein XSL-Stylesheet bestimmt würden. Die Debatte über das SAX-Modell konzentriert sich hauptsächlich auf die übermäßige Speicherreduzierung der DOM-Struktur und die Beschleunigung der Parsing-Zeit des XSL-Stylesheets.
Wir haben jedoch festgestellt, dass viele Systeme, die Sax verwenden, es nicht in vollem Umfang nutzen. Diese Systeme verwenden es, um DOM-Strukturen aufzubauen und Ereignisse über DOM-Strukturen zu senden. Bei diesem Ansatz muss das DOM vor der XML-Verarbeitung aus dem Stylesheet erstellt werden, wodurch die Leistung beeinträchtigt wird.
2. Dynamisches XML generieren
Sobald das XML-Format festgelegt ist, benötigen wir eine Methode, um es dynamisch aus der Datenbank zu übertragen.
Das Generieren von XML-Dokumenten ist relativ einfach, da lediglich ein System erforderlich ist, das mit Zeichenfolgen umgehen kann. Wir haben ein System mit Java-Servlet, Enterprise-Javabean-Server, JDBC und RDBMS (relationales Datenbankverwaltungssystem) erstellt.
• Das Servlet verarbeitet Produktinformationsanfragen, indem es die Aufgabe der Generierung von XML-Dokumenten an die Enterprise-Javabean (EJB) verlagert.
• ejb verwendet JDBC, um die erforderlichen Produktdetails aus der Datenbank abzufragen.
• ejb generiert die XML-Datei und übergibt sie an das Servlet.
Das Servlet ruft die Parsing-Engine auf, um eine HTML-Ausgabe aus XML-Dateien und statischen XSL-Stylesheets zu erstellen.
(Weitere Informationen zur Anwendung von XSL finden Sie unter XSL als Vorlagensprache verwenden.)
Beispiel für die Generierung von XML Der eigentliche Code zum Erstellen einer XML-Dokumentzeichenfolge in Java kann in mehrere Methoden und Klassen unterteilt werden.
Der Code, der den XML-Generierungsprozess startet, wird in der ejb-Methode platziert. Diese Instanz erstellt sofort einen Stringbuffer, um den generierten XML-String zu speichern.
stringbuffer xml = new stringbuffer();
xml.append(xmlutils.begindocument("/browse_find/browse.xsl", "browse", request));
xml.append(product.toxml());
xml.append(xmlutils.enddocument("browse");
out.print(xml.tostring());
Die folgenden drei xml.append()-Variablen selbst sind Aufrufe anderer Methoden.
Datei-Header generieren Die erste zusätzliche Methode ruft die Klasse xmlutils auf, um den XML-Datei-Header zu generieren. Der Code in unserem Java-Servlet lautet wie folgt:
public static string begindocument(string stylesheet, string page)
{
stringbuffer xml = new stringbuffer();
xml.append("<?xml version="1.0"?>n")
.append("<?xml-stylesheet href="")
.append(stylesheet).append(""")
.append(" type ="text/xsl"?>n");
xml.append("<").append(page).append(">n");
return xml.tostring();
}
Dieser Code generiert den XML-Dateiheader. Das Tag <?xml> definiert diese Datei als XML-Datei, die Version 1.0 unterstützt. Die zweite Codezeile zeigt auf den Speicherort des richtigen Stylesheets zum Anzeigen der Daten. Das Letzte, was enthalten ist, ist das Tag auf Elementebene (<browse> in diesem Beispiel). Am Ende der Datei muss nur noch das Tag <browse> geschlossen werden.
<?xml version="1.0"?> <?xml-stylesheet href="/browse_find/browse.xsl" type="text/xsl"?> <browse>
Nachdem Sie die Produktinformationen eingegeben und den Dateikopf vervollständigt haben, wird die Die Steuermethode ruft das Java-Objekt auf, um seine XML-Datei zu generieren. In diesem Beispiel wird das Produktobjekt aufgerufen. Das Produktobjekt verwendet zwei Methoden, um seine XML-Darstellung zu generieren. Die erste Methode toxml() erstellt den Produktknoten durch Generieren der Tags <product> und </product>. Anschließend wird internalxml() aufgerufen, das den erforderlichen Inhalt für die Produkt-XML bereitstellt. internalxml() ist eine Reihe von stringbuffer.append()-Aufrufen. Der Stringbuffer wird ebenfalls in einen String konvertiert und an die Steuermethode zurückgegeben.
öffentlicher String toxml()
{
stringbuffer xml = new stringbuffer("<product>n");
xml.append(internalxml());
xml.append("</product>n");
return xml.tostring();
}
öffentlicher String internalxml()
{
stringbuffer xml = neu
stringbuffer("t")
.append(Produkttyp).append("n");
xml.append("t").append(idvalue.trim())
.append("n");
xml.append("t").append(idname.trim())
.append("n");
xml.append("t").append(page.trim())
.append("n");
Stich?
xml.append("t").append(amount).append("n");
xml.append("t").append(vendor).append("n");
xml.append("tn");
xml.append("t").append(pubdesc).append("n");
xml.append("t").append(vendesc).append("n";
Stich?
return xml.tostring();
}
Abschließend wird nach dem Schließen der Datei die Methode xmlutils.enddocument() aufgerufen. Dieser Aufruf schließt (in diesem Fall) das XML-Tag und vervollständigt schließlich die strukturierte XML-Datei. Der gesamte Stringbuffer der Steuermethode wird ebenfalls in einen String konvertiert und an das Servlet zurückgegeben, das die ursprüngliche http-Anfrage verarbeitet hat.
3. Verwenden Sie XSL als Vorlagensprache
. Um eine HTML-Ausgabe zu erhalten, kombinieren wir die generierte XML-Datei mit der XSL-Vorlage, die steuert, wie die XML-Daten dargestellt werden. Unsere XSL-Vorlagen bestehen aus sorgfältig organisierten XSL- und HTML-Tags.
Beginnen Sie mit dem Erstellen der Vorlage. Der Anfang unserer XSL-Vorlage ähnelt dem folgenden Code. Die erste Codezeile ist erforderlich und definiert diese Datei als XSL-Stylesheet. Das Attribut xmlns:xsl= verweist auf den von dieser Datei verwendeten XML-Namespace und das Attribut version= definiert die Versionsnummer des Namespace. Am Ende der Datei schließen wir das Tag.
Die zweite Codezeile, beginnend mit <xsl:template>, bestimmt den Modus der XSL-Vorlage. Das match-Attribut ist erforderlich und verweist hier auf das XML-Tag <basketpage>. In unserem System enthält das <basketpage>-Tag das <product>-Tag, das der XSL-Vorlage den Zugriff auf die im <product>-Tag eingebetteten Produktinformationen ermöglicht. Auch hier müssen wir das Tag <xsl:template> am Ende der Datei schließen.
Werfen wir als Nächstes einen Blick auf gut organisiertes HTML. Da es von der XML-Parsing-Engine verarbeitet wird, muss es allen Regeln von gut organisiertem XML entsprechen. Im Wesentlichen bedeutet dies, dass alle öffnenden Tags über ein entsprechendes schließendes Tag verfügen müssen. Beispielsweise muss ein <p>-Tag, das nicht normalerweise geschlossen ist, mit </p> geschlossen werden.
<xsl:stylesheet xmlns:xsl=" http://www.w3.org/1999/xsl/transform "
version="1.0">
<xsl:template match="basketpage">
<html>
<Kopf>
<title>Warenkorb / Menge anpassen</title>
</head>
<body bgcolor="#cccc99" bgproperties="fixed" link="#990000" vlink="#990000">
<br>
?br> </xsl:template>
</xsl:stylesheet>
Im Hauptteil der Vorlage gibt es viele XSL-Tags, die zur Bereitstellung der Logik für die Datenpräsentation verwendet werden. Im Folgenden werden zwei häufig verwendete Tags erläutert.
wählen
Das <xsl:choose>-Tag ähnelt dem Anfang einer If-Then-Else-Struktur in herkömmlichen Programmiersprachen. In XSL gibt das Tag „select“ an, dass in dem Teil, in den der Code eintritt, die Zuweisung die Aktion auslöst. Das <xsl:when>-Tag mit zugewiesenen Attributen folgt dem Choose-Tag. Bei korrekter Zuweisung wird der Inhalt zwischen dem öffnenden und schließenden Tag von <xsl:when> verwendet. Bei falscher Zuweisung wird der Inhalt zwischen dem öffnenden und schließenden Tag von <xsl:otherwise> verwendet. Der gesamte Abschnitt endet mit </xsl:choose>.
In diesem Beispiel überprüft das When-Tag die XML-Datei auf das Quantity-Tag. Wenn das Mengen-Tag ein Fehlerattribut mit dem Wert „true“ enthält, zeigt das Mengen-Tag die unten aufgeführten Tabellenzellen an. Wenn der Wert des Attributs nicht wahr ist, zeigt xsl den Inhalt zwischen den else-Tags an. Wenn im Beispiel unten das Fehlerattribut nicht wahr ist, wird nichts angezeigt.
<xsl:choose>
<xsl:when test="quantity[@error='true']">
<td bgcolor="#ffffff"><img height="1" width="1" src="