wal*_*mon 8 jaxb xml-serialization marshalling
JAXB文档就像一本教科书,在我需要使用它之前,我根本没有时间学习JAXB.
我有一个XSD,如果我想使用JAXB来编组和解组什么是工作流程?
我不需要任何细节只是一个高级别的视图.
我所知道的:1.JAXB可用于获取对象并从中创建XML文档,反之亦然2.它使用了一些名为"XJC"的神秘工具,我无法在其网站上找到ANYWHERE的下载3. XJC基于XSD为您创建类
首先,我如何找到XJC?我实际上知道它安装在我的系统上,不知道我从哪里得到它.
其次,无论这个工具是什么以及如何进入我的机器,如何使用最新版本的JAXB运行它?第三,所以如果我的XSD更改,我真的必须重新创建整个Java对象,因此可能使我的所有测试无效吗?或者我可以将对象定义为XSD映射,以便我控制映射,而不是默认代码生成?
我主要习惯于使用XML并使用类似xStream的东西来手动解组,但这不再是我的目的选项.
nos*_*nos 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
Run Code Online (Sandbox Code Playgroud)
并在项目中包含生成的类(更常见的是,您将在构建过程中运行它).
或者我可以将对象定义为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"));
Run Code Online (Sandbox Code Playgroud)
反序列化xml文件
JAXBContext context = JAXBContext.newInstance(SearchParam.class);
Unmarshaller unMarshaller = context.createUnmarshaller();
SearchParam param = (SearchParam) unMarshaller.unmarshal(
new FileInputStream("/tmp/SearchParam.xml"));
Run Code Online (Sandbox Code Playgroud)
反序列化并进行模式验证
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"));
Run Code Online (Sandbox Code Playgroud)
更多信息