首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAXB工作流-如何使用JAXB

JAXB工作流-如何使用JAXB
EN

Stack Overflow用户
提问于 2010-08-05 04:39:35
回答 2查看 2.8K关注 0票数 8

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

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

我不需要任何细节,只需要一个高层次的视图。

我已经知道的是: 1. JAXB可以用来获取对象并从它们创建XML文档,反之亦然。2.它使用了一些神秘的工具,名为" XJC“,我在他们的网站上找不到它的下载。3. XJC基于XSD为您创建类。

首先,如何找到XJC?我实际上知道它安装在我的系统上,但不确定它是从哪里得到的。

其次,无论这个工具是什么,它是如何进入我的机器的,我如何让它在最新版本的JAXB上运行?第三,如果我的XSD发生了变化,我真的必须重新创建整个Java对象,因此可能会使我的所有测试失效吗?或者,我是否可以定义对象到XSD的映射,这样我就可以控制映射,而不是一些默认的代码生成?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-08-05 05:17:29

假设你有JDK6;

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

JDK附带了jaxb,虽然可能有来自http://jaxb.java.net/或其他可用实现的更新版本,但在这一点上您可能不需要担心。

JAXB可以做很多事情,我不能完全确定您想要实现什么。如果你有一个xsd,你可以通过运行下面的命令从它生成java类。

代码语言:javascript
复制
xjc -p com.mypackage myschema.xsd

并将生成的类包含在您的项目中(更典型的是,您应该将其作为构建过程的一部分来运行)。

或者我可以定义对象到

的映射,这样我就可以控制映射,而不是一些默认的代码生成?

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

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

将对象序列化为XML文件

代码语言:javascript
复制
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文件

代码语言:javascript
复制
 JAXBContext context = JAXBContext.newInstance(SearchParam.class);
 Unmarshaller unMarshaller = context.createUnmarshaller();
 SearchParam param = (SearchParam) unMarshaller.unmarshal(
                    new FileInputStream("/tmp/SearchParam.xml"));

反序列化并执行模式验证

代码语言:javascript
复制
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"));

更多信息

  • http://download-llnw.oracle.com/javaee/5/tutorial/doc/bnazf.html
  • http://jaxb.dev.java.net/
票数 15
EN

Stack Overflow用户

发布于 2010-08-05 05:16:55

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

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

JDK (RI),其版本与

  • 更新紧密一致,所以如果您有最新的JDK,您应该很好。

  • MOXy JAXB,可在此处获得的EclipseLink的一部分,http://www.eclipse.org/eclipselink/moxy.php

如果您修改了您的模式,您将能够调整您的对象模型,特别是使用MOXy扩展。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3409647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档