Java >> Java Tutorial >  >> Tag >> XML

JAXB- und XML-Verarbeitung

In letzter Zeit habe ich an einigen interessanten Problemen gearbeitet, über die ich sprechen wollte. Also fing ich an, mehr von JAXB zu studieren APIs und das ganze Kaninchenloch ist riesig. Es gibt viele Dinge, auf die ich mich auf diese APIs konzentrieren kann. In diesem Beitrag werde ich zeigen, wie man JAXB-APIs für die XML-Verarbeitung verwendet.

Was ist JAXB und wie verwendet man APIs für die XML-Verarbeitung?

Lassen Sie mich zunächst über JAXB-APIs sprechen. XML ist also seit einiger Zeit eine Sprache für den Datenaustausch. Java und XML kamen mit einem Partner zusammen, um Entwicklern dabei zu helfen, einen Standard zu schaffen, der zwischen Anwendungen, Webdiensten und Organisationen, die einen ähnlichen Technologie-Stack verwenden, erleichtern soll. Also kamen alle Entwickler zusammen und bauten eine Standard-API für Java Architecture for XML Binding (JAXB) . Ich werde in diesem Beitrag keine weiteren Details zu diesen APIs beschreiben, aber Sie können sich diese offizielle Dokumentation JAXB ansehen. JAXB-APIs helfen beim Konvertieren von XML-Dokumenten in Java-Objekte und umgekehrt.

Szenario 1

Wie binden Sie in diesem Szenario ein Schema an ein Java-Objekt?

JAXB vereinfacht grundsätzlich den Zugriff auf das XML-Dokument im Java-Programm. Als Teil davon binden wir das Schema für das XML-Dokument in einen Satz von Java-Klassen ein.

Um dieses Beispiel zu demonstrieren, zeige ich ein XML-Beispiel books.xml wie unten:


<bookstore>
<book category="cooking">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="children">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="web">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="web" cover="paperback">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>

Um dieses XML in ein Java-Objekt umzuwandeln, gehen wir wie folgt vor

  1. Erstellen Sie einen JAXBContext Objekt
  2. Erstellen Sie einen Unmarshaller mit JAXBContext Objekt
  3. Ruf Unmarshal an Methode auf Unmarshaller
  4. Das Ergebnis ist ein Java-Objekt

package com.betterjavacode.jaxbexample;

import java.util.ArrayList;
 
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement
@XmlType(propOrder = {"bookcategory"})
public class Bookstore
{
   private String bookCategory;
   private List books;

   public Bookstore(){}

   public String getBookCategory()
   {
      return this.bookCategory
   }

   public void setBookCategory(String bookCategory)
   {
     this.bookCategory = bookCategory;
   }

   public List getBooks()
   {
      return this.books;
   }

   public void setBooks(List books)
   {
      this.books = books;
   }
}


package com.betterjavacode.jaxbexample;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(namespace = "com.betterjavacode.jaxbexample.Bookstore")
public class Book
{
   private String title;
   private String author;
   private int year;
   private long price;

   public Book()
   {
   }
   
   public Book(String title, String author, int year, long price)
   {
      this.title = title;
      this.author = author;
      this.year = year;
      this.price = price;
   }

   public String getTitle()
   {
     return title;
   }

   public void setTitle(String title)
   {
     this.title = title;
   }

   public String getAuthor()
   {
     return author;
   } 

   public void setAuthor(String author)
   {
     this.author = author;
   }

   public int getYear()
   {
     return year;
   }

   public void setYear(int year)
   {
     this.year = year;
   }

   public long getPrice()
   {
     return price;
   }

   public void setPrice(long price)
   {
     this.price = price;
   }

}

Mit Anmerkungen und Basisklassen können wir XML einfach in Java-Objekte konvertieren. Dieser beschriebene Prozess sieht im Programm wie folgt aus:


package com.betterjavacode.jaxbexample;

import java.io.File;
import java.util.ArrayList;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class JAXBXMLToJava
{
    public static final Logger LOGGER = LogFactory.getLogger(JAXBXMLToJava.class);

    public static void main(String[] args)
    {
        try
        {
           JAXBContext jaxbContext = JAXBContext.newInstance(Bookstore.class);
           Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
           File xmlFile = new File("C:\\temp\\books.xml");
           Bookstore bookStore = (Bookstore) unmarshaller.unmarshal(xmlFile);

           ArrayList books = bookStore.getBooks();
           for(Book book:books)
           {
              System.out.println("Book: " + book.getTitle());
           }
        }
        catch(JAXBException e)
        {
           LOGGER.debug("unable to unmarshal", e);
        }
    }
}

In diesem Szenario haben wir also eine XML-Datei genommen und diese in ein Java-Objekt konvertiert.

Szenario 2

In diesem Szenario zeige ich eines der Features von JAXB-APIs.

Wie ändere ich die Namespace-Präfixe?

Wenn Sie ein Java-Objekt in XML marshallen, verwendet JAXB Marshaller standardmäßig Standard-Namespace-Präfixe wie ns1 , ns2 , ns3 usw. Während dies aus Gründen der Lesbarkeit ein vollkommen gültiges XML sein kann, könnten Sie auf ein Problem wie die Signaturvalidierung stoßen, wenn die Signaturvalidierungs-API unterschiedliche Namespaces erwartet hat.

In solchen Fällen bietet JAXB einen NamespacePrefixMapper an, mit dem Sie Ihre Namespace-Präfixe ändern können.

Vorteile von JAXB

  • JAXB bietet verschiedene Möglichkeiten, um mit der großen Größe von XML umzugehen
  • Der Umgang mit XML-Daten kann komplex sein, aber in der Java-Welt ist es einfacher, mit Objekten umzugehen. JAXB macht das einfach.
  • JAXB ermöglicht Ihnen den Zugriff auf Daten in nicht sequenzieller Reihenfolge, aber im Gegensatz zur DOM-basierten Verarbeitung zwingt es Sie nicht, durch einen Baum zu navigieren, um auf die Daten zuzugreifen.
  • Und JAXB ist flexibel

Schlussfolgerung

Zuvor hatte ich gezeigt, wie man einen SOAP-Webservice mit JAXB-Marshaller nutzt. In diesem Beitrag habe ich eine kurze Einführung in JAXB-APIs und deren Verwendung für die XML-Verarbeitung gegeben. Es gibt viele andere Funktionen, die JAXB-APIs bieten.

Referenzen

  1. JAXB-Nutzerleitfaden – Nutzerleitfaden
  2. Java-Architektur für XML-Bindung – JAXB


No
Java-Tag