【问题标题】:JAXB Work-Flow - How Do You Jump into Using JAXBJAXB 工作流 - 如何开始使用 JAXB
【发布时间】:2011-03-25 11:46:48
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: xml-serialization jaxb marshalling


    【解决方案1】:

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

    JAXB 是一个规范,所以有多种实现方式:

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

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

    【讨论】:

      【解决方案2】:

      假设你有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 类

      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"));    
      

      反序列化 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"));
      

      更多信息

      【讨论】:

      • 首先,很好的答案,非常感谢。问题:那么您通常会创建 java 对象,然后将它们复制粘贴到您的项目中吗?你说它通常是构建脚本的一部分,但这对我来说似乎倒退了,因为你怎么知道你正在编写的使用这些对象的代码会编译,更不用说按预期运行了?另外,像自动完成这样的东西不能工作,因为在你构建项目之前对象不存在。
      • 当然,“复制/粘贴”生成的代码是可以的 - 缺点是您只需要记住在架构更改时执行此操作。如果您将其作为构建的一部分,自动完成将正常工作,您只需先运行构建一次。您的项目是否按预期编译或工作与“手动”运行 xjc 没有什么不同,并且您可能有单元测试来捕获大多数此类错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多