Java >> Java tutorial >  >> Tag >> XML

JAXB og XML-behandling

På det seneste har jeg arbejdet på et par interessante problemer, som jeg gerne ville tale om. Så jeg begyndte at studere mere af JAXB API'er og hele kaninhullet er enormt. Der er mange ting, jeg kan fokusere på disse API'er. I dette indlæg vil jeg vise, hvordan man bruger JAXB API'er til XML-behandling.

Hvad er JAXB, og hvordan bruger man API'er til XML-behandling?

Lad mig først tale om JAXB API'er. Så XML har været et sprog til dataudveksling i nogen tid nu. Java og XML kom med en partner til at hjælpe udviklere med en standard til at lette mellem applikationer, webtjenester, organisationer, der bruger en lignende teknologistak. Så alle udviklere kom sammen, og de byggede en standard API til Java Architecture for XML Binding (JAXB) . Jeg vil ikke beskrive andre detaljer om disse API i dette indlæg, men du kan tjekke denne officielle dokumentation JAXB. JAXB API'er hjælper med at konvertere XML-dokumenter til Java Object og omvendt.

Scenarie 1

Hvordan binder man et skema til Java-objekt i dette scenarie?

JAXB grundlæggende forenkler adgangen til XML-dokumentet i Java-programmet. Så som en del af dette binder vi skema for XML-dokument til et sæt Java-klasser.

For at demonstrere dette eksempel viser jeg et eksempel på XML books.xml som nedenfor:


<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>

For at konvertere denne XML til Java-objekt, følger vi følgende proces

  1. Opret en JAXBContext Objekt
  2. Opret en Unmarshaller ved hjælp af JAXBContext Objekt
  3. Ring til Unmarshal metode på Unmarshaller
  4. Resultatet vil være et 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;
   }

}

Ved hjælp af annoteringer og basisklasser kan vi nemt konvertere xml til java-objekt. Den proces som beskrevet vil se ud som nedenfor i programmet:


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);
        }
    }
}

Så i dette scenarie tog vi en xml og konverterede den til et java-objekt.

Scenarie 2

I dette scenarie vil jeg vise en af ​​funktionerne i JAXB API'er.

Hvordan ændrer man navneområdets præfikser?

Som standard, når du samler Java-objekter til XML, bruger JAXB Marshaller standardnavneområdepræfikser som ns1 , ns2 , ns3 osv. Selvom dette kan være perfekt gyldig XML af hensyn til læsbarheden, kan du løbe ind i et problem som signaturvalidering, hvis Signature validation API forventede forskellige navneområder.

I sådanne tilfælde tilbyder JAXB en NamespacePrefixMapper, som giver dig mulighed for at ændre dine navnerumspræfikser.

Fordele ved JAXB

  • JAXB tilbyder forskellige måder at håndtere den store størrelse af XML på.
  • Håndtering af XML-data kan være kompleks, men i Java-verdenen er det lettere at håndtere objekter. JAXB gør det nemt.
  • JAXB giver dig adgang til data i ikke-sekventiel rækkefølge, men i modsætning til DOM-baseret behandling, tvinger det dig ikke til at navigere gennem et træ for at få adgang til dataene.
  • Og JAXB er fleksibel

Konklusion

Tidligere havde jeg vist, hvordan man bruger en SOAP-webservice ved hjælp af JAXB marshaller. I dette indlæg har jeg givet en kort introduktion til JAXB API'er og hvordan man bruger dem til XML-behandling. Der er en masse andre funktioner, som JAXB API'er tilbyder.

Referencer

  1. JAXB-brugervejledning – brugervejledning
  2. Java-arkitektur til XML-binding – JAXB


No
Java tag