`
maimode
  • 浏览: 412382 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

xml与java对象映射

阅读更多

JAXB提供了XML到java对象(类)之间的相互映射(转换),我们可以利用JAXB来消除繁琐的XML解析工作。

下面是引用oracle网站中有关jaxb的一句话。

 

Now developers have another Java API at their disposal that can make it easier to access XML documents: Java Architecture for XML Binding (JAXB). A Reference Implementation of the API is now available in the Java Web Services Developer Pack V 1.1.

 

JAXB包括两部分:

1.编译器程序:负责根据XML Schema(xsd文件)编译生成对应java类文件

2.JAXB API:程序中调用这些api,再结合1中的类达到映射的目的

 

对于JAXB的安装及编译器部分的使用请参见:http://maimode.iteye.com/admin/blogs/1329929

 

本篇将主要针对api部分给出代码示例,并在后文中给出文档校验的方法。

 

无论是将xml映射为java对象还是将java对象映射为xml,都首先要使用JAXB的编译器将XSD文件编译成java类文件,然后在项目中导入这些类。

 

需要引用一下类:

 

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
 

 

 

A. 将XML映射为java对象

// 建立上下文 amos.note为编译器生成的类文件的包名称
JAXBContext jaxbContext = JAXBContext.newInstance("amos.note");
// 建立unmashaller对象
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
// 将xml文件映射为java对象
Note note = (Note) unmarshaller.unmarshal(new File("e:/t/t.xml"));
// TODO ....

 以上代码片段就是将t.xml文件中的根Note节点映射为了Note对象,也可以将其他形式的xml进行映射。

 

 

B. 将java对象映射为XML

// 准备要映射的对象 amos.note.ObjectFactory是编译器生成的类
amos.note.ObjectFactory objFactory = new amos.note.ObjectFactory();
Note note = objFactory.createNote();
//上面的note对象也可是A部分中的那个note对象,这样A、B两个步骤和在一起就是对xml文件的更新了
// 建立上下文 amos.note为编译器生成的类文件的包名称
JAXBContext jaxbContext = JAXBContext.newInstance("amos.note");
// 建立mashaller对象
Marshaller marshaller = jaxbContext.createMarshaller();
// 将java对象映射为xml文件
marshaller.marshal(note, new FileOutputStream("e:/t/t.xml"));

 以上代码片段就是将Note对象映射为t.xml文件中的根Note节点,也可以映射成为其他形式的对象。

 

 

基于XSDXML文档校验

 

参考:http://www.ibm.com/developerworks/cn/xml/x-javaxmlvalidapi.html

 

Java 5 引入了 javax.xml.validation 包,提供了独立于模式语言的验证服务接口。这个包也可用于 Java 1.3 及更高版本,不过要单独安装 JAXP 1.3。其他产品中,Xerces 2.8 包含了这个库的实现。 

 

javax.xml.validation API 使用三个类来验证文档:SchemaFactorySchema 和 Validator。还大量使用了 TrAX javax.xml.transform.Source 接口来表示 XML 文档。简言之,SchemaFactory 读取模式文档(通常是 XML 文件)并创建 Schema 对象。Schema 创建一个 Validator 对象。最后,Validator 对象验证表示为 Source 的 XML 文档。 

 

改变验证所依据的模式、要验证的文档甚至使用的模式语言都很简单。但无论什么情况,验证都需要经过下列五个步骤:

 

1) 为编写模式所用的语言加载一个模式工厂。

2) 编译源文件中的模式。

3) 用编译后的模式创建一个验证程序。

4) 为需要验证的文档创建 Source 对象。StreamSource 通常最简单。

5) 验证输入的源文档。如果文档无效,validate() 方法将抛出 SAXException。否则什么也不显示。

 

可以反复使用同一个验证程序和同一个模式多次。但是所有类都不是线程安全的或者可重入的。如果用多个线程同时验证,一定要保证每个线程有自己的 Validator 和 Schema 对象。

 

需要导入的包:

 

import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
 

 

下面是验证的主要代码:

/**
	 * 根据xsd文件校验一个xml文件是否有效,当无效异常时交由errorHandler处理异常
	 * 
	 * @param xmlFilePath
	 * @param xsdFilePath
	 * @param errorHandler
	 * @return
	 * @throws IOException
	 * @throws SAXException
	 */
	private boolean doValidate(String xmlFilePath, String xsdFilePath,
			ErrorHandler errorHandler) throws IOException, SAXException {
		boolean rt = false;
		// 1. Lookup a factory for the W3C XML Schema language
		SchemaFactory factory = SchemaFactory
				.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
		// 2. Compile the schema.
		// Here the schema is loaded from a java.io.File, but you could use
		// a java.net.URL or a javax.xml.transform.Source instead.
		File schemaLocation = new File(xsdFilePath);
		Schema schema = factory.newSchema(schemaLocation);

		// 3. Get a validator from the schema.
		Validator validator = schema.newValidator();
		validator.setErrorHandler(errorHandler);

		// 4. Parse the document you want to check.
		Source source = new StreamSource(xmlFilePath);

		// 5. Check the document
		try {
			validator.validate(source);
			rt = true;
		} catch (SAXException ex) {
			rt = false;
		}
		return rt;
	}

需要注意的是,当传入有效的ErrorHandler示例后,执行validator.validate(source)方法时无论是否出现异常都不在抛出SAXException异常。

 

因此,下面的方法包装上面的方法来验证

 

/**
	 * 根据xsd文件校验一个xml文件是否有效
	 * @param xmlFilePath
	 * @param xsdFilePath
	 * @return true-有效 false-无效
	 * @throws IOException
	 * @throws SAXException
	 */
	public boolean validate(String xmlFilePath, String xsdFilePath) throws IOException, SAXException{
		return this.doValidate(xmlFilePath, xsdFilePath, null);
	}

	
	/**
	 * 根据xsd文件校验一个xml文件是否有效,当无效异常时交由errorHandler处理异常
	 * @param xmlFilePath
	 * @param xsdFilePath
	 * @param errorHandler
	 * @throws IOException
	 * @throws SAXException
	 */
	public void validate(String xmlFilePath, String xsdFilePath, ErrorHandler errorHandler) throws IOException, SAXException{
		boolean rt = this.doValidate(xmlFilePath, xsdFilePath, errorHandler);
	}

 

 

其实,验证的这个步骤不必单独占用一些列资源而只做这一件事,可以在上面的映射过程中完成,oracle网站上提供了验证的说明,但是我自己测试发现他说的方法已经废弃了,因此,没有在映射的代码中提到,还有待研究。

 

附件xml.zip是完整的示例程序

  • 大小: 14 KB
  • 大小: 5.3 KB
  • 大小: 7.1 KB
  • 大小: 7.3 KB
  • xml.zip (5.5 KB)
  • 下载次数: 158
1
3
分享到:
评论
1 楼 duyu8866 2014-12-17  

相关推荐

    xml转换java对象

    该例子是将xml文件映射为java对象的例子。 commons-betwixt-0.8.jar

    XStream <--> Java 对象序列化为 XML 互换

    使用 XStream 不用任何映射就能实现多数 Java 对象的序列化。在生成的 XML 中对象名变成了元素名,类中的字符串组成了 XML 中的元素内容。使用 XStream 序列化的类不需要实现 Serializable 接口。XStream 是一种序列...

    将Java对象和XML自动绑定的Castor1.3API

    Castor是ExoLab Group下面的一个开放源代码的项目,它主要实现的是O/R映射功能。它主要API和数据接口为:JDO-like, SQL, OQL, JDBC, LDAP, XML, DSML。...它可以在Java对象、XML文本、SQL数据表以及LDAP目录之间绑定。

    castor R/M映射神器

    castor是一种将java对象和XML自动绑定的开源软件。它可以在java对象、XML文本、SQL数据表以及LDAP目录之间绑定。Castor几乎是JAXB的替代品。Castor是ExoLab Group下面的一个开放源代码的项目,它主要实现的是O/R映射...

    对象关系映射,并持久化到数据库的开源组件

    对象关系映射,并持久化到数据库的开源组件,是对JDBC 的封装,主要负责java 对象的持久化.。 对象序列化适应临时的少量的对象备份。 对象持久化和关系型数据库联合在一起,适应大量的对象持久存储

    xmlbeans-3.0.1.jar【说明:JAVA、XML文档处理、数据绑定、数据解析、数据操作、Java对象转换】

    1. 基于XML Schema:xmlbeans-3.0.1.jar基于XML Schema定义,可以从XML Schema生成Java类,实现XML数据和Java对象之间的映射。 2. 灵活性:库提供了多种处理XML数据的方法,开发者可以根据需求选择最适合的方法。

    [精品]JAVA6新特性介绍使用JAXB来实现对象与XML之间的映射.doc

    [精品]JAVA6新特性介绍使用JAXB来实现对象与XML之间的映射

    mybatis自动生成Java实体类和映射文件的自动生成类工具

    mybatis实体类以及mapper映射xml文件及接口的自动生成类工具

    Spring 的Object/XML 映射支持Demo

    Spring 的Object/XML 映射支持Demo,spring结合第三方Castor ...它的目的是在 Java 对象(几乎总是一个 plain old Java object,或简写为 POJO)和 XML 文档之间来回转换。 eclipse的,带着jar包

    xmlbean轻轻松松读写XML的利器

     Hibernate已经成为目前流行的面向Java环境的对象/关系数据库映射工具.    在Hibernate等对象/关系数据库映射工具出现之前,对数据库的操作是通过JDBC来实现的,对数据库的任何操作,开发人员都要自己写SQL语句来...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第2章 Java对象持久化技术概述  2.1 直接通过JDBC API来持久化实体域对象  2.2 ORM简介  2.2.1 对象-关系映射的概念  2.2.2 ORM中间件的基本使用方法  2.2.3 常用的ORM中间件  2.3 实体域对象的其他持久化模式...

    ObjectMapper:一个用于将自定义类自动映射到XMLSOAP或从XMLSOAP自动映射的Java库

    对象映射器 一个Java库,用于将自定义类自动映射到XML / SOAP和从XML / SOAP映射。 使用ObjectMapper,您可以根据您的复杂对象自动构建XML和SOAP数据包,从而可能节省数百行的序列化代码。 ## Download在这里您可以...

    Java 对象XML解析器castor-0.9

    要实现的是O/R映射功能。它主要API和数据接口为:JDO-like, SQL, OQL, JDBC, LDAP, XML, DSML。它支持分布式目录事务处理和时间;提供处理XML、Directory、XADirectory的类库,提供从XML到JAVA类的转换机制。

    spring x/o映射详解

    spring xml / object 映射 配置详解 可跟剧mapper自动将java对象转为xml 也可以吧xml转为java对象

    gs-xsd2bean:无依赖关系的XML到对象映射器

    Xsd2bean-一种无依赖关系的XML到对象映射器 Xsd2bean是一个XML到对象的映射器。 给定一个xsd,它将生成表示xsd中描述的模型的Java代码,该模型具有读取xml并创建Java对象的能力,反之亦然(unmarshall / marshall)...

    java操作xml的方法汇总及解析

    主要介绍了java操作xml的方法汇总及解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    XStream XML与Json转换

    在缺省情况下,XStream不需要配置映射关系,对象和字段将映射为同名XML元素。但是当对象和字段名与XML中的元素名不同时,XStream支持指定别名。XStream支持以方法调用的方式,或是Java 标注的方式指定别名。 ...

    JAVA_API1.6文档(中文)

    java.awt.geom 提供用于在与二维几何形状相关的对象上定义和执行操作的 Java 2D 类。 java.awt.im 提供输入方法框架所需的类和接口。 java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的...

Global site tag (gtag.js) - Google Analytics