2013-06-06 31 views
1

嗨我需要使用JAXB創建以下XML,但由於它有許多父子關係,所以我不想讓許多類創建該XML。 任何人都可以給我如何可以使這個XML單類的幫助下想法...如何讓類可以被JAXB解析?

<Info> 
    <details> 
     <arrange> 
      <name>joseph</name> 
      <ID>12</ID> 
      <Date>2012-03-25T11:23:42+10:00</Date> 
      <LatestDate> 
       <Start>2012-06-25T09:24:59+10:00</Start> 
       <End>2013-06-25T09:24:59+10:00</End> 
      </LatestDate> 
      <Additional> 
       <name>IVR</name> 
      </Additional> 
     </arrange> 
    </details> 
</Info> 

回答

2

寫一個XSD並使用JAXB的XJC代碼生成器來創建類。

+0

感謝您的想法 – Aquarius24

0

你有需要的JAXB的註釋添加到您的類。

然後,您將能夠解析XML文件並獲取Java對象。

0

備註:我是EclipseLink JAXB (MOXy)的領導者和JAXB (JSR-222)專家組的成員。

既然您正在尋找使用單一類映射到XML,那麼您可以使用MOXy的@XmlPath擴展(請參閱:http://blog.bdoughan.com/2010/07/xpath-based-mapping.html)。

信息

import java.util.Calendar; 
import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="Info") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Info { 

    @XmlPath("details/arrange/name/text()") 
    private String name; 

    @XmlPath("details/arrange/ID/text()") 
    private int id; 

    @XmlPath("details/arrange/Date/text()") 
    private Calendar date; 

    @XmlPath("details/arrange/LatestDate/Start/text()") 
    private Calendar start; 

    @XmlPath("details/arrange/LatestDate/End/text()") 
    private Calendar end; 

    @XmlPath("details/arrange/Additional/name/text()") 
    private String additionalName; 

} 

jaxb.properties

要指定莫西爲您的JAXB提供你需要包括一個名爲在同一個包jaxb.properties與下面進入你的領域模型(見:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

演示

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

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum16956564/input.xml"); 
     Info info = (Info) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(info, System.out); 
    } 

} 

的input.xml /輸出

<?xml version="1.0" encoding="UTF-8"?> 
<Info> 
    <details> 
     <arrange> 
     <name>joseph</name> 
     <ID>12</ID> 
     <Date>2012-03-25T11:23:42+10:00</Date> 
     <LatestDate> 
      <Start>2012-06-25T09:24:59+10:00</Start> 
      <End>2013-06-25T09:24:59+10:00</End> 
     </LatestDate> 
     <Additional> 
      <name>IVR</name> 
     </Additional> 
     </arrange> 
    </details> 
</Info>