2013-04-08 14 views
14

Sono sicuro che questa è una delle molte domande duplicate relative alle conversioni di oggetti XML in oggetti Java. Ma ho iniziato questo thread dal momento che non riuscivo a trovare più semplice o alla ricerca di una soluzione più semplice.Mappatura di entità XML a oggetti Java

Ho un xsd [infatti lo sto progettando] e xml. vorrei auto-mappare i dati XML Java beans secondo mappatura

<tns:SummaryCart xmlns:tns="SummaryCart" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="SummaryCart.xsd"> 
    <SummaryElement type="test"> 
     <order>1</order> 
     <id>A</id> 
     <displayName>A</displayName> 
     <subElements> 
      <order>1</order> 
      <id>Preactivation</id> 
      <displayName>Preactivation</displayName> 
     </subElements> 
     <maxlines>1</maxlines> 
    </SummaryElement> 
</tns:SummaryCart> 

Ora i miei classi Java saranno

public class SummaryCart{ 
    private List<SummaryElement> summaryElementList; 
} 
public class SummaryElement { 
    private int order; 
    private String id; 
    private String displayName; 
    private String property; 
    private List<SummaryElement> subElements; 
    private int maxlines; 
    private String type; 
} 

C'è qualche semplice strumento/quadro che può auto-mappare la dati da XML a Java bean [DEVONO supportare attributi/mappatura degli elementi]. Il tutorial sarà buono.

Btw, sto usando la struttura di primavera, se il vantaggio dell'asfalto viene preso, è il benvenuto.

+5

Usa JAXB con annotazioni. [Here] (http://jaxb.java.net/tutorial/) è un tutorial. –

risposta

28

Di seguito è riportato come è possibile mappare il proprio oggetto in XML utilizzando JAXB (JSR-222). Un'implementazione è incluso nel JDK/JRE iniziano Java SE 6. JAXB è supportato da molla (vedi paragrafo 8.5: http://static.springsource.org/spring-ws/site/reference/html/oxm.html)

SummaryCart

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlRootElement(name="SummaryCart", namespace="SummaryCart") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class SummaryCart{ 

    @XmlElement(name="SummaryElement") 
    private List<SummaryElement> summaryElementList; 

} 

SummaryElement

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class SummaryElement { 

    private int order; 
    private String id; 
    private String displayName; 
    private String property; 
    private List<SummaryElement> subElements; 
    private int maxlines; 

    @XmlAttribute 
    private String type; 

} 

Demo

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(SummaryCart.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum15881876/input.xml"); 
     SummaryCart sc = (SummaryCart) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "SummaryCart.xsd"); 
     marshaller.marshal(sc, System.out); 
    } 

} 

input.xml/Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:SummaryCart xmlns:ns2="SummaryCart" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="SummaryCart.xsd"> 
    <SummaryElement type="test"> 
     <order>1</order> 
     <id>A</id> 
     <displayName>A</displayName> 
     <subElements> 
      <order>1</order> 
      <id>Preactivation</id> 
      <displayName>Preactivation</displayName> 
      <maxlines>0</maxlines> 
     </subElements> 
     <maxlines>1</maxlines> 
    </SummaryElement> 
</ns2:SummaryCart> 
+0

Per non dire, stiamo usando JDK 5. Sì, applicazione legacy. Posso farlo con Java 5 includendo una qualsiasi delle librerie specifiche usando Maven. – Reddy

+0

Ecco un file pom.xml che estrae in EclipseLink MOXy l'impl JAXB (sono il lead MOXy): https://github.com/bdoughan/blog20110819/blob/master/pom.xml –

1

Fondamentalmente si vuole unmarshal il tuo XML. Ecco un tutorial dettagliato che descrive come utilizzare il comando JAXB xjc su generate a Java class from XML Schema. Un esperto xjc plugin è disponibile anche per la vostra comodità.

+1

È anche possibile utilizzare un'implementazione JAXB quando si inizia dalle classi Java: http://stackoverflow.com/a/15884122/383861 –

+1

Noted Blaise. La mia comprensione iniziale sulla domanda dell'OP era che voleva generare file Java dal nulla, usando solo l'XSD come punto di partenza. Rileggendolo di nuovo, hai ragione, sembra che abbia solo bisogno di un modo per mapparli automaticamente. Grazie per non down-voting :) :) – Jops

Problemi correlati