2013-05-06 58 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