Inhaltsverzeichnis:
- Vielseitiger Code im Vergleich zu benutzerdefiniertem Code
- Die Vorteile der Anpassung
- Die Essenz von JAXB
Video: Azure Friday | Azure App Service with Hybrid Connections to On-premises Resources 2024
Sie können mit JAXB einen benutzerdefinierten Code erstellen - das Java-API für die XML-Bindung . Mit JAXB nehmen Sie ein XML-Dokument und erstellen eine Java-Klassendatei, die für die Verarbeitung des Dokuments geeignet ist. Wenn sich Ihre Bedürfnisse ändern und die Klasse nicht mehr tut, was Sie wollen, dann erzeugen Sie einfach eine neue Unterklasse.
Wenn Sie SAX- oder DOM-Code schreiben, erstellen Sie ein XML-Verarbeitungsprogramm. Ihr Programm liest ein Dokument und verwendet das Dokument, um nützliche Arbeit zu verrichten - beginnend mit etwas harmlosem wie public void startElement oder node. getNodeName (). In jedem Fall macht Ihr Programm keine Annahmen darüber, was sich im Dokument befindet. Das Dokument hat ein Wurzelelement, einige Kindelemente, und das ist alles. Alle besonderen Annahmen, die Sie zu diesem Dokument machen, schränken die Nützlichkeit des Codes ein.
Vielseitiger Code im Vergleich zu benutzerdefiniertem Code
Betrachten Sie den Code in den Listen 1 und 2. Bei Listing 1 werden fünf Knoten in einem Dokumentbaum gescannt. Diese fünf Knoten müssen auf eine bestimmte Weise angeordnet werden, sonst stürzt das Programm ab. (Die Liste möchte einen Kommentar und einen Stammknoten mit mindestens zwei untergeordneten Elementen direkt unter dem Stammknoten.)
Listing 1: Anzeigen einiger Knoten
import org. w3c. dom. Knoten;
import org. w3c. dom. BenannteNodeMap;
Klasse MyTreeTraverser
{
MyTreeTraverser (Knotenknoten)
{
System. aus. println (Knoten. getNodeName ());
Knoten = Knoten. getFirstChild ();
System. aus. println (Knoten. getNodeName ());
Knoten = Knoten. getNextSibling ();
System. aus. println (Knoten. getNodeName ());
Knoten = Knoten. getFirstChild ();
System. aus. println (Knoten. getNodeName ());
Knoten = Knoten. getNextSibling ();
System. aus. println (Knoten. getNodeName ());
}
}
Listing 2: Durchlaufen des DOM-Baums
import org. w3c. dom. Knoten;
import org. w3c. dom. BenannteNodeMap;
Klasse MyTreeTraverser
{
Knotenknoten;
MyTreeTraverser (Knotenknoten)
{
dies. Knoten = Knoten;
displayName ();
displayValue ();
if (node. GetNodeType () == Knoten. ELEMENT_NODE)
displayAttributes ();
System. aus. println ();
displayChildren ();
}
void displayName ()
{
System. aus. drucken ("Name:");
System. aus. println (Knoten. getNodeName ());
}
void displayValue ()
{
String nodeValue = Knoten. getNodeValue ();
if (nodeValue! = Null)
nodeValue = nodeValue. trimmen();
System. aus. drucken ("Wert:");
System. aus. println (nodeValue);
}
void displayAttributes ()
{
NamedNodeMap attribs = Knoten. getAttributes ();
für (int i = 0; i { System. aus. println (); System. aus. Drucken ("Attribut:"); System. aus. print (attribs. item (i). getNodeName ()); System. aus. Drucken ("="); System. aus. println (attribs. item (i). getNodeValue ()); } } void displayChildren () { Knotenkind = Knoten. getFirstChild (); while (child! = Null) { neuer MyTreeTraverser (untergeordnet); Kind = Kind. getNextSibling (); } } } Der Code in Listing 2 ist viel allgemeiner. Dieser Code überprüft die Dokumentstruktur während der Ausführung. Wenn der Code einen untergeordneten Knoten findet, durchsucht er das untergeordnete Element und sucht nach Enkelkindern. Wenn es keine Enkel gibt, sucht der Code nach Geschwistern. Der Code kann jeden Dokumentbaum verarbeiten - unabhängig davon, ob er einen Knoten oder tausend Knoten hat. Somit ist Listing 2 vielseitiger als Listing 1. Diese Vielseitigkeit bringt jedoch Nachteile mit sich - einschließlich der Möglichkeit eines sehr hohen Overheads. Der Code in Listing 2 muss das gesamte XML-Dokument analysieren - und dann eine Repräsentation des Baums des Dokuments in den Speicher des Computers einfügen. Wenn das Dokument sehr groß ist, ist die Darstellung groß: Der Speicher wird mit all diesen temporären Daten aufgebläht, und der Code in Listing 2 verlangsamt sich zu einem Crawl. Stellen Sie sich vor, Sie versuchen, nach Faneuil Hall in Boston, Massachusetts, zu fahren. Es spielt keine Rolle, wo Sie anfangen; Die Reise wird immer verwirrend und schwierig sein. Wie auch immer, Sie müssen Ihre Route planen. Sie können sich im nahe gelegenen Revere oder Cambridge oder in der Innenstadt von Boston verlaufen. Abhängig von Ihren Ressourcen haben Sie zwei Möglichkeiten: Die Verwendung der Papierkarte erfordert mehr Arbeit (mehr Zeit, Mühe, Geschicklichkeit und Geduld) als die Verwendung des sprechenden GPS. Warum? Weil die Papierkarte nicht an Ihre spezifischen Bedürfnisse angepasst ist. In der Tat heißt es: "Hier ist der gesamte Bostoner Ballungsraum. Faneuil Hall ist irgendwo da drin. Sie finden heraus, was als nächstes zu tun ist. " Ein benutzerdefiniertes System ist (wie Sie vielleicht erwarten würden) einfacher zu verwenden als eines, das nicht auf Ihre unmittelbare Situation zugeschnitten ist. Somit erzeugt der XML-Verarbeitungscode von Listing 2 einen riesigen, ressourcenaufwühlenden DOM-Baum im Speicher Ihres Computers ("Hier ist der Baum - Sie finden heraus, was als Nächstes zu tun ist …"), weil der Code nicht t angepasst.Der Code funktioniert für jedes alte Dokument - nicht nur für das, das Sie zur Hand haben - und verschlingt immer Ressourcen dafür. Die Idee hinter JAXB ist es, eine maßgeschneiderte Klasse zu erstellen, die Ihren gegenwärtigen Bedürfnissen entspricht. Sie nehmen die Beschreibung eines XML-Dokuments, führen es durch ein spezielles Programm namens -Schema-Compiler aus und erhalten eine brandneue Klasse namens generierte Klasse . Diese generierte Klasse wurde optimiert, um mit bestimmten XML-Dokumenten zu arbeiten. Beispiel: Wenn Ihre XML-Dokumente über Elemente mit dem Namen Total verfügen, kann die generierte Klasse setTotal- und getTotal-Methoden haben. Wenn das Element eines Dokuments ein fullName-Attribut hat, kann die generierte Klasse setFullName- und getFullName-Methoden haben. (Siehe Abbildung 1.) Die Verbindung zwischen einem Teil eines XML-Dokuments und einem Teil einer Java-Klasse wird als -Bindung bezeichnet. Bei all diesen Bindungen repräsentiert eine Instanz der Klasse ein einzelnes XML-Dokument. Wie verbindet man ein Objekt mit einem XML-Dokument? Nun, die generierte Klasse hat Methoden namens unmarshal und marshal. (Siehe Abbildung 2.) Mit diesen Methoden können Sie die Daten in einem XML-Dokument abrufen und ändern.Die Vorteile der Anpassung
Die Essenz von JAXB