Xml serialization JAXB工作流程-如何开始使用JAXB

Xml serialization JAXB工作流程-如何开始使用JAXB,xml-serialization,jaxb,marshalling,Xml Serialization,Jaxb,Marshalling,JAXB文档就像一本教科书,在使用它之前,我不必花时间学习JAXB的所有内容 我有一个XSD,如果我想使用JAXB封送和取消封送,那么工作流是什么 我不需要任何细节,只是一个高层次的观点 我已经知道: 1.JAXB可用于获取对象并从中创建XML文档,反之亦然 2.它使用了一个名为“XJC”的神秘工具,我在他们的网站上找不到下载的工具 3.XJC基于XSD为您创建类 首先,我如何找到XJC?我实际上知道它安装在我的系统上,但不确定它是从哪里获得的。 第二,不管这个工具是什么,它是如何进入我的机器的

JAXB文档就像一本教科书,在使用它之前,我不必花时间学习JAXB的所有内容

我有一个XSD,如果我想使用JAXB封送和取消封送,那么工作流是什么

我不需要任何细节,只是一个高层次的观点

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

首先,我如何找到XJC?我实际上知道它安装在我的系统上,但不确定它是从哪里获得的。
第二,不管这个工具是什么,它是如何进入我的机器的,我如何让它使用最新版本的JAXB运行的? 第三,如果我的XSD发生了变化,那么我真的必须重新创建整个Java对象,从而使我的所有测试失效吗?或者我可以定义对象到XSD的映射,这样我就可以控制映射,而不是一些默认的代码生成


我主要习惯于使用XML和xStream之类的工具来手动解组,但这不再是我的选择。

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

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

  • Metro(RI)的发行版与JDK更新密切相关,因此,如果您有最新的JDK,您应该会很好
  • MOXy JAXB,EclipseLink的一部分
如果修改模式,您将能够调整对象模型,尤其是使用MOXy扩展

要开始,请参阅:
假设您有JDK6

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

JDK随jaxb一起提供,虽然可能有来自或其他实现的较新版本,但此时您可能不需要担心这一点

JAXB可以做很多事情,但我不能完全确定您想要完成什么。如果您有一个xsd,您可以通过运行例如

xjc -p com.mypackage myschema.xsd
并将生成的类包含在项目中(更典型的情况是,您会将其作为构建过程的一部分运行)

或者我可以定义对象到XSD的映射吗 这样我就可以控制地图了, 不是一些默认的代码生成

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

如前所述,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"));    
反序列化并进行架构验证

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"));
更多信息


首先,回答得很好,我很感激。问:那么您通常会创建java对象,然后将它们复制粘贴到您的项目中吗?您说它通常是构建脚本的一部分,但我觉得这似乎是倒退的,因为这样您怎么知道您正在编写的使用这些对象的代码将被编译,更不用说按预期运行?另外,像自动完成这样的事情无法工作,因为在您构建项目之前对象不存在。当然,“复制/粘贴”生成的代码是可以的-缺点是您只需要记住在模式更改时这样做。如果你把它作为构建的一部分,那么自动完成会很好,你只需要先运行一次构建。无论您的项目是否按照预期编译或工作,都和“手动”运行xjc没有什么不同,您可能会让单元测试捕获大部分此类错误。
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"));