`
maimode
  • 浏览: 414508 次
  • 性别: 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  

相关推荐

    JAXB工具类 xml转为java对象 java对象转为xml

    JAXB是Java开发中处理XML的强大工具,通过注解和API实现了XML与Java对象的自动转换。了解并熟练掌握JAXB,能够提升XML数据处理的效率和代码的可读性。在实际项目中,结合JAXB与XML Schema,可以构建更健壮、易于维护...

    xml转换java对象

    1. **配置映射**: 使用Betwixt,你需要创建一个`BeanIntrospector`实例,并通过`introduceBean()`方法指定XML与Java对象的映射规则。通常,Betwixt会尝试基于Java类的公共字段和方法自动建立映射,但也可以通过注解...

    xml和java对象互相转换的两种方法

    本文将详细介绍两种主要的XML与Java对象互相转换的方法:DOM(Document Object Model)解析和JAXB(Java Architecture for XML Binding)。 1. DOM解析: DOM是一种W3C标准,它将XML文档解析成一棵由节点组成的树,...

    xStream 实现xml与 java对象的转换

    xStream库的核心概念是“映射”,它通过创建一个映射关系,将Java对象与XML元素和属性对应起来。这使得我们可以轻松地将Java对象转换为XML文档,反之亦然。这个过程对于处理复杂的对象结构尤其有用,因为xStream能够...

    xml和java对象互转

    XStream的核心理念是通过简单的注解或者类定义,将XML结构直接映射到Java对象的属性上,从而实现无痛的转换。 要使用XStream进行XML和Java对象的转换,首先需要将其引入项目。在给定的压缩包中包含的"jar包"很可能...

    xml文件自动转成java对象工具

    XML文件自动转换为Java对象工具是一种实用的开发辅助软件,它可以帮助程序员快速地将XML数据映射到Java类,从而简化了数据处理的过程。在Java开发中,XML常被用作数据交换格式,但手动编写Java类来表示XML结构既耗时...

    XML转换为JAVA对象的方法

    XStream是一个强大的Java库,它可以将Java对象序列化为XML,同时也能将XML反序列化为等效的Java对象。这种功能使得开发者能够在XML和Java之间无缝地进行数据转换。在IDEA(IntelliJ IDEA)这样的集成开发环境中,...

    XML与Java对象互相转化Demo(Eclipse)

    在Java编程中,XML与Java对象的相互转化是常见的需求,特别是在持久化、配置文件处理或网络通信中。本教程通过一个Eclipse项目演示了如何实现这一转化。 首先,我们需要理解XML文档的基本结构。XML文档由元素...

    xstream轻松解析xml到java对象

    这使得开发者无需编写大量繁琐的代码就能完成XML与Java对象之间的转换。下面我们将深入探讨Xstream的核心概念和使用方法。 1. **安装与引入** 首先,你需要将XStream库引入到你的项目中。如果你使用的是Maven,...

    JAVA对象与XML互转

    1. **JAXB**(Java Architecture for XML Binding):这是Java标准API,用于将Java对象映射到XML文档,反之亦然。使用JAXB,我们可以方便地实现对象到XML的序列化和XML到对象的反序列化。 - **创建Java类**:首先,...

    JAVA对象与XML相互转化DEMO

    JAXB允许我们自动将XML文档映射到Java对象,以及将Java对象转换为XML文档。要使用JAXB,你需要先创建一个Java类来表示XML结构,然后利用JAXB提供的工具生成对应的XML绑定类。以下是基本步骤: 1. **定义Java对象**...

    好用的xStream XML和JAVA对象互相转换的简单示例

    然而,将XML与Java对象直接对应起来操作可以大大简化编程工作,这就是XStream库的作用所在。XStream是一个轻量级、高性能的库,能够将Java对象序列化为XML,同时也能将XML反序列化回Java对象,实现XML和Java对象的...

    webservice之使用jaxb把xml转换Object或把对象转换成xml文件

    在Java世界中,使用JAXB(Java Architecture for XML Binding)库可以方便地实现XML数据与Java对象之间的转换,从而在WebService中轻松处理数据交换。本篇文章将深入探讨如何使用JAXB进行XML到Object以及Object到XML...

    xml 与java 对象转换

    `XStream` 是一个强大的Java库,它允许我们将Java对象序列化为XML,反之亦然,极大地简化了XML与Java对象之间的转换过程。下面我们将详细探讨`XStream`库的工作原理以及如何使用它来实现XML和Java对象的互换。 首先...

    xml转对象封装的简单与复杂xml的转化写法

    总的来说,XML到对象的转换是一个涉及XML解析、对象映射和可能的自定义逻辑的过程。不同的工具和库提供了不同级别的抽象和控制,开发者应根据实际需求选择合适的方法,并注意处理可能的复杂性和异常情况。

    XML与Java 对象的数据转换 Smooks

    接着,我们需要创建一个Smooks配置文件(通常为.smooks或.xml扩展名),在这个文件中定义XML元素和Java对象之间的映射关系。Smooks支持使用XPath表达式来定位XML节点,并将其映射到Java对象的属性。 例如,假设我们...

    xml 转Java bean工具

    标题中的"xml 转Java bean工具"指的就是这样一种工具,它能够帮助开发者快速地将XML数据映射到Java对象上。这类工具通常会分析XML文件的结构,包括元素、属性等,并基于这些信息生成相应的Java Bean类。生成的Java ...

    使用XStream是实现XML与Java对象的转换(3)--注解

    XStream是一款强大的库,它简化了XML与Java对象之间的转换过程。本文将深入探讨如何利用XStream的注解功能来实现这一目标。 首先,XStream库的核心理念是通过简单的映射机制将Java对象直接转换为XML,反之亦然。...

    java对象与xml的互相转换

    Java对象与XML之间的转换是Java开发中常见的需求,特别是在数据交换、配置文件存储或Web服务交互等场景。本文将深入探讨如何实现Java对象到XML以及XML到Java对象的转换。 首先,Java对象到XML的转换通常涉及到Java...

Global site tag (gtag.js) - Google Analytics