Erstellen benutzerdefinierter Code mit Java API for XML Binding (JAXB)

Sie können benutzerdefinierte Code erstellen mit JAXB

- das Java API for XML Binding. Mit JAXB, nehmen Sie ein XML-Dokument und Sie machen eine Java-Klasse-Datei, die für die Verarbeitung des Dokuments perfekt ist. Wenn sich Ihre Anforderungen ändern und die Klasse nicht mehr tut, was Sie wollen damit zu tun, laichen Sie nur eine neue Unterklasse.

Wenn Sie SAX oder DOM-Code zu schreiben, ein XML-Verarbeitungsprogramm erstellen. Ihr Programm liest ein Dokument, und verwendet das Dokument nützliche Arbeit zu tun - beginnend mit etwas harmlos wie public void start oder node.getNodeName (). So oder so, macht Ihr Programm keine Annahmen über das, was im Inneren des Dokuments ist. Das Dokument hat eine Wurzel Element, einige untergeordnete Elemente und das ist alles. Irgendwelche speziellen Annahmen, die Sie zu diesem Dokument machen verengen tatsächlich die Nützlichkeit des Codes.

Vielseitig Code im Vergleich zu kundenspezifischen Code

Betrachten Sie den Code in den Listings 1 und 2 Listing 1, scannt fünf Knoten in einem Dokumentenbaum. Diese fünf Knoten müssen eine bestimmte Art und Weise angeordnet sein, sonst stürzt das Programm ab. (Die Auflistung will einen Kommentar und einen Wurzelknoten, mit mindestens zwei Kindern direkt unter dem Wurzelknoten.)

Listing 1: ein paar Knoten angezeigt

Import org.w3c.dom.Node-
Import org.w3c.dom.NamedNodeMap-
Klasse MyTreeTraverser
{
MyTreeTraverser (Node-Knoten)
{
System.out.println (node.getNodeName ()) -
node = node.getFirstChild () -
System.out.println (node.getNodeName ()) -
node = node.getNextSibling () -
System.out.println (node.getNodeName ()) -
node = node.getFirstChild () -
System.out.println (node.getNodeName ()) -
node = node.getNextSibling () -
System.out.println (node.getNodeName ()) -
}
}

Listing 2: Verfahrgeschwindigkeit den DOM-Baum

Import org.w3c.dom.Node-
Import org.w3c.dom.NamedNodeMap-
Klasse MyTreeTraverser
{
Knoten Knoten-
MyTreeTraverser (Node-Knoten)
{
this.node = node-
Anzeigename()-
anzeige () -
if (node.getNodeType () == Node.ELEMENT_NODE)
displayAttributes () -
System.out.println () -
displayChildren () -
}
nichtig display ()
{
System.out.print ( "Name:") -
System.out.println (node.getNodeName ()) -
}
nichtig anzeige ()
{
String nodeValue = node.getNodeValue () -
if (nodeValue! = null)
nodeValue = nodeValue.trim () -
System.out.print ( "Wert:") -
System.out.println (nodeValue) -
}
Leere displayAttributes ()
{
NamedNodeMap attribs = node.getAttributes () -
for (int i = 0-i lt; attribs.getLength () - i ++)
{
System.out.println () -
System.out.print ( "Attribut:") -
System.out.print (attribs.item (i) .getNodeName ()) -
System.out.print ( "=") -
System.out.println (attribs.item (i) .getNodeValue ()) -
}
}
Leere displayChildren ()
{
Knoten Kind = node.getFirstChild () -
während (Kind! = null)
{
neue MyTreeTraverser (Kind) -
Kind = child.getNextSibling () -
}
}
}

Der Code in Listing 2 ist viel allgemeiner. Dieser Code überprüft die Dokumentenstruktur, wie es läuft. Wenn der Code einen untergeordneten Knoten findet, sucht er das Kind und sucht nach Enkelkinder. Wenn es keine Enkelkinder sind, sieht der Code für Brüder und Schwestern. Der Code kann jedes Dokument Baum behandeln - ob ein Knoten oder tausend Knoten hat.

Somit 2 Eintrag vielseitiger ist als 1. Listing Allerdings kommt diese Vielseitigkeit mit Abstrichen - einschließlich der Möglichkeit einer sehr hohen Aufwand. Der Code in Listing 2 hat das gesamte XML-Dokument zu analysieren - und dann eine Darstellung der Struktur eines Dokuments setzen in den Speicher des Computers. Wenn das Dokument sehr groß ist, dann ist die Darstellung groß: Speicher wird aufgebläht mit allen, die temporäre Daten und der Code in Listing 2 verlangsamt zu einem Schleichen.

Die Vorteile der Anpassung

Stellen Sie sich vor Sie Faneuil Hall in Boston, Massachusetts zu fahren versuchen. Es spielt keine Rolle, wo Sie die Reise beginnen Von- immer verwirrend und schwierig sein. Wie auch immer, haben Sie Ihre Route zu planen. Sie können in der Nähe von Revere oder Cambridge oder in der Innenstadt von Boston verloren gehen. Je nach Ressourcen, haben Sie zwei Möglichkeiten:

  • Sie können an einer Tankstelle anhalten und eine Karte kaufen. Wenn Sie das tun, dann können Sie nie zu Faneuil Hall zu sichern. Immerhin müssen Sie feststellen, wo Sie auf der Karte sind, suchen Sie nach alternativen Routen, um eine Route wählen, und dann (Himmel Ihnen helfen) versuchen, den Weg zu folgen, ohne wieder verloren.
  • Sie können teuer, im Gespräch GPS-System sagen, dass Sie zu Faneuil Hall erhalten möchten. Das System wird eine individuelle Route plotten und Sie führen, Abbiegehinweise, von was auch immer unglücklich Ort, den Sie in der optimalen Route sind, die Faneuil Hall von dort führt. Die Strecke ist so maßgeschneiderte, dass die GPS-Stimme sagt (zum Beispiel): "Es gibt kein Zeichen an dieser Kreuzung, aber trotzdem nach links abbiegen." Später, sagt die Stimme: "Es gibt zwei Zeichen an dieser Kreuzung, und die Zeichen einander widersprechen. Aber gerade sowieso machen."

die Papierkarte unternimmt mehr Arbeit (mehr Zeit, Mühe, Geschicklichkeit und Geduld) als das Reden GPS. Warum? Da die Papierkarte auf Ihre spezifischen bedarfs- in Wirkung nicht angepasst wird, heißt es: "Hier ist das gesamte Stadtgebiet Boston. Faneuil Hall dort irgendwo ist. Sie herauszufinden, was als nächstes zu tun. "

Ein kundenspezifisches System ist (wie man erwarten könnte) leichter ein zu verwenden, als die nicht auf Ihre unmittelbare Situation zugeschnitten ist. Somit ermöglicht die Verarbeitung von XML-Code von Listing 2 einen großen, ressourcen gulping DOM-Baum im Speicherplatz des Computers ( "Hier ist der Baum - Sie herauszufinden, was als nächstes zu tun. . .. "), Weil der Code nicht angepasst wird, funktioniert der Code für jedes alte Dokument - nicht nur die, die Sie auf der Hand haben - und verschlingt immer Ressourcen, um es zu tun.

Das Wesen der JAXB

Die Idee hinter JAXB ist maßgeschneiderte Klasse zu erstellen Ihren jetzigen Bedürfnissen gerecht zu werden. Sie nehmen die Beschreibung eines XML-Dokuments, führen Sie es durch ein spezielles Programm namens ein Schema-Compiler, und erhalten eine ganz neue Klasse namens generierte Klasse. Diese generierte Klasse wird rationalisiert mit bestimmten XML-Dokumenten zu arbeiten.

Zum Beispiel, wenn Ihre XML-Dokumente haben Elemente namens Total, dann kann die erzeugte Klasse setTotal und getTotal Methoden haben. Wenn ein Dokument des Elements ein fullname Attribut hat, dann kann die erzeugte Klasse setFullName und getFullName Methoden. (Siehe Abbildung 1.)

Die Verbindung zwischen einem Teil eines XML-Dokument und einem Teil einer Java-Klasse genannt Bindung. Mit all diesen Bindungen stellt eine Instanz der Klasse ein einzelnes XML-Dokument.


Abbildung 1: Ein Objekt stellt ein Dokument.

Wie verbinden Sie ein Objekt mit einem XML-Dokument? Nun, die generierte Klasse hat Methoden Abstellungs und Marschall benannt. (Siehe Abbildung 2)

  • Die Abstellungs Methode liest eine XML-Datei. Die Methode ruft Werte aus dem XML-Dokument und ordnet diese Werte an Variablen in der Java-Objekt.
  • Der Marschall Methode schreibt eine XML-Datei. Die Methode ruft Werte aus dem Java-Objekt, und verwendet diese Werte, die XML-Dokument zu erstellen.

Mit Methoden wie diese, können Sie die Daten in einem XML-Dokument abrufen und ändern.


Figur 2: Lesen und Schreiben von Werten.

Menü