JAXB工作流程 - 如何使用JAXB

时间:2010-08-04 20:39:35

标签: xml-serialization jaxb marshalling

JAXB文档就像一本教科书,在我需要使用它之前,我根本没有时间学习JAXB。

我有一个XSD,如果我想使用JAXB来编组和解组什么是工作流程?

我不需要任何细节只是一个高级视图。

我所知道的: 1. JAXB可用于获取对象并从中创建XML文档,反之亦然 它使用了一些名为“XJC”的神秘工具,我无法在他们的网站上找到ANYWHERE的下载 3. XJC基于XSD为您创建课程

首先,我如何找到XJC?我实际上知道它安装在我的系统上,不知道我从哪里得到它 其次,无论这个工具是什么以及如何进入我的机器,如何使用最新版本的JAXB运行它? 第三,所以如果我的XSD更改,我真的必须重新创建整个Java对象,因此可能使我的所有测试无效吗?或者我可以将对象定义为XSD映射,以便我控制映射,而不是默认代码生成?

我主要习惯使用XML并使用类似xStream之类的东西来手动解组,但这不再适用于我的目的。

2 个答案:

答案 0 :(得分:15)

假设你有JDK6;

xjc位于JDK的bin /文件夹中,类似于C:\ Program Files(x86)\ Java \ jdk1.6.0_20 \ bin \ xjc.exe

JDK附带了jaxb,虽然可能有http://jaxb.java.net/或其他可用实现的更新版本,但此时您可能不需要关心它。

JAXB可以做很多事情,我并不确定你要完成的是什么。如果你有一个xsd,你可以通过运行eg。

从中生成java类
xjc -p com.mypackage myschema.xsd

并在项目中包含生成的类(更常见的是,您将在构建过程中运行该类)。

  

或者我可以将对象定义为XSD映射   这样我就能控制映射,   不是一些默认代码生成?

生成的类只是带有一些注释的pojos,您可以自己创建这些类,并通过注释完全控制映射。

如上所述,jaxb可以做很多事情,这里只是一些基本的例子,SearchParam / SearchType是xjc从一个小的自定义生成的类.xsd

将对象序列化为XML文件

JAXBContext context = JAXBContext.newInstance(SearchParam.class);
Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
List<String> hours = new LinkedList<String>();
hours.add("2009.12.11");
hours.add("2009.12.13");

SearchParam param = new SearchParam();
param.setFilter("greater");
param.setHours(hours);
param.setSearchType(SearchType.Fuzzy);
marshaller.marshal(param, new FileWriter("/tmp/SearchParam.xml"));    

反序列化xml文件

 JAXBContext context = JAXBContext.newInstance(SearchParam.class);
 Unmarshaller unMarshaller = context.createUnmarshaller();
 SearchParam param = (SearchParam) unMarshaller.unmarshal(
                    new FileInputStream("/tmp/SearchParam.xml"));

反序列化并进行架构验证

JAXBContext context = JAXBContext.newInstance(SearchParam.class);
Unmarshaller unMarshaller = context.createUnmarshaller();
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
                 .newSchema(new  File("/tmp/schema1.xsd"));
unMarshaller.setSchema(schema);
SearchParam param = unMarshaller.unmarshal(
                      new FileInputStream("/tmp/SearchParam.xml"));

更多信息

答案 1 :(得分:1)

您可能已经安装了XJC。检查JDK 6安装的bin目录。一旦找到,如果您只是运行XJC,它将为您提供命令行选项。

JAXB是一个规范,因此有多个实现:

如果您修改架构,您将能够调整对象模型,尤其是使用MOXy扩展。

要开始,请参阅: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted