2013-04-08 220 views
14

我確定這是圍繞XML到Java對象轉換的許多重複問題之一。 但我開始這個線程,因爲我找不到更簡單或尋找更簡單的解決方案。將XML實體映射到Java對象

我有一個xsd [Infact我正在設計它]和xml。 我想爲每個映射

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

現在XML數據的Java bean自動映射我的Java類將

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

有沒有簡單的工具/框架,它可以自動映射從XML到Java bean的數據[必須支持屬性/元素映射]。教程將會很好。

順便說一句,我使用的是Spring框架,如果採用spring-oxm優勢,那麼它受到歡迎。

+5

使用JAXB與註解。 [這裏](http://jaxb.java.net/tutorial/)是一個教程。 – 2013-04-08 14:39:53

回答

28

下面介紹如何使用JAXB (JSR-222)將對象映射到XML。一個實現包括在JDK/JRE開始與Java SE 6 JAXB由彈簧支撐(見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; 

} 

演示

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 /輸出

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

不是說,我們正在使用JDK 5.是的,遺產應用程序。我可以通過使用Maven包含任何特定庫來實現它嗎? – Reddy 2013-04-09 01:53:08

+0

下面是一個pom.xml文件,它將EclipseLink MOXy作爲JAXB impl(我是MOXy領導者):https://github.com/bdoughan/blog20110819/blob/master/pom.xml – 2013-04-09 01:58:19

1

基本上你想要unmarshal你的XML。以下是詳細的教程,介紹如何使用JAXB xjc命令至generate a Java class from XML Schema。一個maven xjc plugin也可以爲您提供方便。

+1

從Java類啓動時,您也可以使用JAXB實現:http://stackoverflow.com/a/15884122/383861 – 2013-04-08 16:20:57

+1

注意到Blaise。我對OP的問題最初的理解是他想要毫無用處地生成Java文件,只用XSD作爲他的出發點。重新讀一遍,你是對的,似乎他只需要一種方法來自動映射它們。感謝您的不投票。:) – Jops 2013-04-08 16:30:41