2013-05-06 54 views
4

我是jaxb的新手。我的問題是以下幾點:使用jaxb,是否可以執行從xml文件到java對象的自動映射? 從xml文件開始,是否有東西生成帶註釋jaxb relaitve的Java類?JaxB自動從XML解析爲Java類

+2

你需要一個XSD,而不僅僅是XML。看看['xjc'](http://docs.oracle.com/javase/6/docs/technotes/tools/share/xjc.html)。 – 2013-05-06 10:32:41

+0

如何生成一個xsd文件?你可以自動做到這一點? – 2013-05-06 10:43:16

+1

可以從許多示例XML中推斷出XSD。看[我的回答](http://stackoverflow.com/a/16397009/851811)。但是,擁有真正的XSD可能會更安全,或者如果您瞭解結構,可以自己設計它。 – 2013-05-06 10:44:53

回答

0

是的,JAXB自動做marshallingunmarshalling但它需要一個模式文件。 JaxB用於將XML與Java對象綁定。使用XSD模式文件,它可以進行編組和解組。有幾個簡單的ant任務可以使用,比如XJC。

+0

如果要生成Java類,JAXB(JSR-222)實現只需要一個XML模式。如果您從Java類開始,則不需要XML模式。 – 2013-05-06 11:00:04

5

確實有可能。但是,您需要一個XSD而不是一個XML文件。有一些工具(例如Trang)可以從一個或多個示例XML文件中推斷出XSD。

考慮到如果XML樣本不完整,或者模式無法在單個XML文件(獨佔元素等)中完全表示,則使用工具生成此XSD可能會導致結果不準確。

一旦你有一個XSD,使用xjc爲了生成編組/解組類。

xjc myxsd.xsd 

這將產生註解類,JAXB將用於編組/解組。注意你也可以自己編寫這些類。一旦你有他們,只需在你的代碼中使用它們:

File file = new File("myFile.xml"); 
JAXBContext jaxbContext = JAXBContext.newInstance(MyRootElement.class); 
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
MyRootElement element = (MyRootElement) jaxbUnmarshaller.unmarshal(file); 
+0

感謝您的回答,但我有另一個問題。雖然做xjc myxsd.xsd我有這個異常: java.lang.IllegalArgumentException:非法模式字符'g' 這是什麼意思? – 2013-05-06 12:59:24

+0

似乎有一個[相關的錯誤](https://java.net/jira/browse/JAXB-915?page=com.atlassian.streams.streams-jira-plugin%3Aactivity-stream-issue-tab)與JAXB 2.2.6並特別影響意大利語區域。它似乎是在2.2.7中修復的。您可能也會發現這個問題很有用:[無法使用JAXB生成類](http://stackoverflow.com/q/10757211/851811)。 – 2013-05-06 13:25:37