文档章节

JAXB操作xml

oaks
 oaks
发布于 2017/01/23 20:12
字数 1937
阅读 9
收藏 0
package com.yss.framework.api.util;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.net.URL;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
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;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Node;

import com.yss.framework.api.common.co.ImpNamespaceContext;
import com.yss.framework.api.exception.YssException;
import com.yss.framework.api.logger.LogManager;
import com.yss.framework.api.logger.Logger;

/**
 * <code>JAXBProcessor</code>类功能说明<br>
 * 实现采用JAXB技术序列与反序列XML与JAVABEAN的处理<br>
 * 创建人:leeyu <br>
 * 创建时间: 2011-11-16<br>
 * 创建版本:v4.5.0.1<br>
 */
public class JAXBProcessor {
	
	private Logger logger = LogManager.getLogger(getClass());

	/**
	 * 对应的路径地址
	 */
	private String contextPath = "";

	/**
	 * jaxb上下文配置
	 */
	private JAXBContext jc = null;

	/**
	 * XPath
	 */
	private XPath xp = null;

	/**
	 * 设置配置类的路径
	 * 
	 * @param contextPath
	 *            配置类的路径
	 */
	public void setContextPath(String contextPath) {
		this.contextPath = contextPath;
	}

	/**
	 * 初始化
	 */
	private void init() {
		try {
			jc = JAXBContext.newInstance(contextPath);
			xp = XPathFactory.newInstance().newXPath();
		} catch (JAXBException e) {
			logger.log("初始化JAXB出错!", e);
		}
	}

	/**
	 * 通过Class初始化JAXBContext
	 * 
	 * @param clazz
	 */
	private void init(Class<?> clazz) {
		try {
			jc = JAXBContext.newInstance(clazz);
			xp = XPathFactory.newInstance().newXPath();
		} catch (JAXBException e) {
			logger.log("初始化JAXB出错!", e);
		}

	}

	/**
	 * 反序列化功能处理<br>
	 * 根据指定的xml节点反序列生成JAVABEAN
	 * 
	 * @param node
	 *            xml节点
	 * @return java对象(Pojo类)
	 * @throws JAXBException
	 */
	public Object unMarshal(Node node) throws YssException {
		Object obj = null;
		if (null != node) {
			Unmarshaller un = null;
			try {
				if (jc == null) {
					init();
				}
				un = jc.createUnmarshaller();
				obj = un.unmarshal(node);
			} catch (JAXBException e) {
				throw new YssException(e);
			}
		}
		return obj;
	}

	/**
	 * 反序列化的功能处理<br>
	 * 将一个XML文档反序列化生成为JAVABEAN
	 * 
	 * @param f
	 *            文件
	 * @return java对象(Pojo类)
	 */
	public Object unMarshal(java.io.File f) throws YssException{
		Object obj = null;
		Unmarshaller un = null;
		try {
			if (jc == null) {
				init();
			}
			un = jc.createUnmarshaller();
			obj = un.unmarshal(f);
		} catch (JAXBException e) {
			throw new YssException(e);
		}
		return obj;
	}

	/**
	 * 反序列化的功能处理<br>
	 * 将一个XML文档反序列化生成为JAVABEAN
	 * 
	 * @param f
	 *            文件
	 * @return java对象(Pojo类)
	 */
	public Object unMarshal(Object obj, File f) throws YssException {
		Unmarshaller un = null;
		try {
			if (jc == null) {
				init(obj.getClass());
			}
			un = jc.createUnmarshaller();
			obj = un.unmarshal(f);
		} catch (JAXBException e) {
			throw new YssException(e);
		}
		return obj;
	}
	
	/**
	 * 反序列化并校验XML
	 * @param obj 
	 * @param xmlFile
	 * @param schemaURL
	 * @return
	 * @throws YssException
	 * @author jiangjin
	 */
	public Object unMarshal(Object obj, File xmlFile, URL schemaURL) throws YssException {
		Unmarshaller un = null;
		try {
			if (jc == null) {
				init(obj.getClass());
			}
			un = jc.createUnmarshaller();
			SchemaFactory schemaFactory = SchemaFactory
					.newInstance("http://www.w3.org/2001/XMLSchema");
			Schema schema = schemaFactory.newSchema(schemaURL);
			un.setSchema(schema);
			unMarshalValidater(schema, xmlFile);
			obj = un.unmarshal(xmlFile);
		} catch (Exception e) {
			throw new YssException(e);
		}
		return obj;
	}

	@SuppressWarnings("unchecked")
	/**
	 * 增加只接按字符串来反序列化
	 */
	public<T> T unMarshal(T obj, String xmlBuf) throws YssException{
		Unmarshaller un = null;
		try {
			if (jc == null) {
				init(obj.getClass());
			}
			un = jc.createUnmarshaller();
			obj = (T)un.unmarshal(new StreamSource(new StringReader(xmlBuf)));
		} catch (JAXBException e) {
			throw new YssException(e);
		}
		return obj;
	}

	/**
	 * 反序列化的功能处理<br>
	 * 将一个XML文档反序列化生成为JAVABEAN
	 * 
	 * @param obj
	 *            解析Pojo对象
	 * @param url
	 *            文件
	 * 
	 * @return java对象(Pojo类)
	 */
	public Object unMarshal(Object obj, URL url) throws YssException {
		Unmarshaller un = null;
		try {
			if (jc == null) {
				init(obj.getClass());
			}
			un = jc.createUnmarshaller();
			obj = un.unmarshal(url);
		} catch (JAXBException e) {
			throw new YssException(e);
		}
		return obj;
	}

	/**
	 * 反序列化的功能处理 <br>
	 * 将一个XML文档反序列化生成为JAVABEAN
	 * 
	 * @param is
	 *            输入流
	 * @return java对象(Pojo类)
	 */
	public Object unmarshal(java.io.InputStream is) throws YssException {
		Object obj = null;
		Unmarshaller un = null;
		try {
			if (jc == null) {
				init();
			}
			un = jc.createUnmarshaller();
			obj = un.unmarshal(is);
		} catch (JAXBException e) {
			throw new YssException(e);
		}
		return obj;
	}

	/**
	 * JAXB反序列化XML文件<br>
	 * 读取文件时需指定XML路径,XSD路径及配置JAVABEAN的路径
	 * 
	 * @param xmlPath
	 *            XML的完整路径
	 * @param xsdPath
	 *            XSD的完整路径
	 * @param contextPath
	 *            JAVABEAN的配置路径
	 * @return 返回根节点对象
	 * @throws YssException
	 */
	public Object unmarshal(String xmlPath, String xsdPath, String contextPath)
			throws YssException {
		try {

			this.contextPath = contextPath;

			// 实例化上下文的配置路径
			JAXBContext jaxbContext = JAXBContext.newInstance(contextPath);
			// 实例化反序列化对象
			Unmarshaller unMarshaller = jaxbContext.createUnmarshaller();
			SchemaFactory schemaFactory = SchemaFactory
					.newInstance("http://www.w3.org/2001/XMLSchema");
			// 实例化XSD文件
			Schema schema = schemaFactory.newSchema(new File(xsdPath));
			unMarshaller.setSchema(schema);

			// 读出XML文件
			File xmlFile = readXML(xmlPath);

			// 开始XML格式的验证
			unMarshalValidater(schema, xmlFile);
			// 返回对象
			return unMarshaller.unmarshal(xmlFile);
		} catch (Exception ex) {
			throw new YssException(ex);
		}
	}
	
	public Object unmarshal(URL xmlURL, URL xsdURL, String contextPath,ClassLoader classLoader)
			throws YssException {
		try {
			// 实例化上下文的配置路径
			JAXBContext jaxbContext = JAXBContext.newInstance(contextPath,classLoader);
			// 实例化反序列化对象
			Unmarshaller unMarshaller = jaxbContext.createUnmarshaller();
			SchemaFactory schemaFactory = SchemaFactory
					.newInstance("http://www.w3.org/2001/XMLSchema");
			// 实例化XSD文件
			Schema schema = schemaFactory.newSchema(xsdURL);
			unMarshaller.setSchema(schema);

			// 开始XML格式的验证
			unMarshalValidater(schema, xmlURL);
			// 返回对象
			return unMarshaller.unmarshal(xmlURL);
		} catch (Exception ex) {
			throw new YssException(ex);
		}
	}

	/**
	 * 读出XML文件
	 * 
	 * @param xmlPath
	 *            XML完整的路径
	 * @return 文件类型的流
	 * @throws YssException
	 */
	private File readXML(String xmlPath) throws Exception {
		File xml = null;
		try {
			xml = new File(xmlPath);
			if (!xml.exists()) {
				throw new Exception("文件【" + xmlPath + "】不存在!");
			}
		} catch (Exception ex) {
			throw new Exception(ex.getMessage());
		}
		return xml;
	}

	/**
	 * XML结构验证
	 * 
	 * @param Schema
	 *            Schema对象
	 * @param xmlPath
	 *            XML路径
	 * @throws YssException
	 */
	private void unMarshalValidater(Schema schema, File xmlFile)
			throws YssException {
		try {
			/** 开始XML格式的验证 **/
			// 通过Schema产生针对于此Schema的验证器,利用xsd文件进行验证
			Validator validator = schema.newValidator();
			// 得到验证的数据源,就是xml文件
			Source source = new StreamSource(xmlFile);
			validator.validate(source);
		} catch (org.xml.sax.SAXParseException saxe) {
			throw new YssException("XML【" + xmlFile.getPath() + "】结构验证失败,请检查第"
					+ saxe.getLineNumber() + "行XML配置!\n" + saxe.getMessage());
		} catch (Exception ex) {
			throw new YssException(ex.getMessage());
		}
	}
	
	private void unMarshalValidater(Schema schema, URL xmlURL)
			throws YssException {
		try {
			/** 开始XML格式的验证 **/
			// 通过Schema产生针对于此Schema的验证器,利用xsd文件进行验证
			Validator validator = schema.newValidator();
			// 得到验证的数据源,就是xml文件
			Source source = new StreamSource(xmlURL.openStream());
			validator.validate(source);
		} catch (org.xml.sax.SAXParseException saxe) {
			throw new YssException("XML【" + xmlURL.getPath() + "】结构验证失败,请检查第"
					+ saxe.getLineNumber() + "行XML配置!\n" + saxe.getMessage());
		} catch (Exception ex) {
			throw new YssException(ex.getMessage());
		}
	}

	/**
	 * 序列化处理
	 * 
	 * @param contextPath
	 *            保存配置类的路径
	 * @param obj
	 *            JAVABEAN(Pojo)类
	 * @param stream
	 *            输出流
	 * @throws JAXBException
	 */
	public static void marshal(String contextPath, Object obj,
			java.io.OutputStream stream) throws YssException {

		JAXBContext jc;
		try {
			jc = JAXBContext.newInstance(contextPath);
			Marshaller m = jc.createMarshaller();
			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");
	
			m.marshal(obj, stream);
		} catch (JAXBException e) {
			throw new YssException(e);
		}finally{
		}
		
	}

	/**
	 * 序列化处理
	 * 
	 * @param contextPath
	 *            保存配置类的路径
	 * @param obj
	 *            JAVABEAN(Pojo)类
	 * @param stream
	 *            输出流
	 * @throws JAXBException
	 */
	public static void marshal(Class<?> clazz, Object obj, String xmlFilePath)
			throws YssException {
		JAXBContext jc = null;
		Marshaller m = null;
		BufferedOutputStream os = null;
		try {
			jc = JAXBContext.newInstance(new Class[] { clazz });
			m = jc.createMarshaller();
			os = new BufferedOutputStream(new FileOutputStream(new File(
					xmlFilePath)));

			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8");

			m.marshal(obj, os);
			os.flush();
		} catch (Exception e) {
			throw new YssException(e);
		} finally {
			try {
				if (os != null) {
					os.close();
				}
				if (m != null) {
					m = null;
				}
				if (jc != null) {
					jc = null;
				}
			} catch (Exception ex) {
			}
		}
	}

	/**
	 * 序列化处理
	 * 
	 * @param contextPath
	 *            保存配置类的路径
	 * @param obj
	 *            JAVABEAN(Pojo)类
	 * @param stream
	 *            输出流
	 * @throws JAXBException
	 */
	public static String marshalWithReturnString(Class<?> clazz, Object obj,
			String encodingSet) throws YssException {
		String retInfo = "";
		JAXBContext jc = null;
		Marshaller m = null;
		ByteArrayOutputStream baos = null;
		try {
			baos = new ByteArrayOutputStream();
			jc = JAXBContext.newInstance(new Class[] { clazz });
			m = jc.createMarshaller();

			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
			m.setProperty(Marshaller.JAXB_ENCODING, encodingSet);

			m.marshal(obj, baos);
			baos.flush();
			retInfo = baos.toString("UTF-8");
		} catch (Exception e) {
			throw new YssException(e);
		} finally {
			try {
				if (baos != null) {
					baos.close();
				}
				if (m != null) {
					m = null;
				}
				if (jc != null) {
					jc = null;
				}
			} catch (Exception ex) {
			}
		}
		return retInfo;
	}

	/**
	 * 序列化处理 返回的字符集是encodingSet 不支持格式化输出
	 * 
	 * @param contextPath
	 *            保存配置类的路径
	 * @param obj
	 *            JAVABEAN(Pojo)类
	 * @param stream
	 *            输出流
	 *  
	 * @throws JAXBException
	 */
	public static String marshalWithReturnString2(Class<?> clazz, Object obj,
			String encodingSet) throws YssException {
		String retInfo = "";
		JAXBContext jc = null;
		Marshaller m = null;
		ByteArrayOutputStream baos = null;
		try {
			baos = new ByteArrayOutputStream();
			jc = JAXBContext.newInstance(new Class[] { clazz });
			m = jc.createMarshaller();

			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, false);
			m.setProperty(Marshaller.JAXB_ENCODING, encodingSet);

			m.marshal(obj, baos);
			baos.flush();
			retInfo = baos.toString(encodingSet);
		} catch (Exception e) {
			throw new YssException(e);
		} finally {
			try {
				if (baos != null) {
					baos.close();
				}
				if (m != null) {
					m = null;
				}
				if (jc != null) {
					jc = null;
				}
			} catch (Exception ex) {
			}
		}
		return retInfo;
	}
	
	/**
	 * 根据指定的xPath和文档对象获取指定节点
	 * 
	 * @param xPath
	 *            xpath
	 * @param doc
	 *            文档对象
	 * @return
	 * @throws XPathExpressionException
	 */
	public Node getAppointedXpathNode(String xPath, Document doc) {
		Node node = null;
		if (null != xPath && null != doc) {
			try {
				if (xp == null) {
					init();
				}
				// 设置命名空间上下文
				xp.setNamespaceContext(new ImpNamespaceContext());
				// 根据xpath计算节点位置
				node = (Node) xp.evaluate(xPath, doc, XPathConstants.NODE);
			} catch (XPathExpressionException e) {
				logger.log("查询 XML 节点出错!", e);
			}
		}
		return node;
	}

	/**
	 * JAXB反序列化XML文件<br>
	 * 读取文件时需指定XML路径,XSD路径及配置JAVABEAN的路径
	 * 
	 * @param xmlPath
	 *            XML的完整路径
	 * @param xsdPath
	 *            XSD的完整路径
	 * @param contextPath
	 *            JAVABEAN的配置路径
	 * @return 返回根节点对象
	 * @throws YssException
	 */
	public Object unmarshal(BufferedInputStream xml, InputStream xsd, Class<?> o)
			throws YssException {
		try {
			// 实例化上下文的配置路径
			JAXBContext jaxbContext = JAXBContext.newInstance(o);
			// 实例化反序列化对象
			Unmarshaller unMarshaller = jaxbContext.createUnmarshaller();
			SchemaFactory schemaFactory = SchemaFactory
					.newInstance("http://www.w3.org/2001/XMLSchema");
			// 实例化XSD文件
			Schema schema = schemaFactory.newSchema(new StreamSource(xsd));
			unMarshaller.setSchema(schema);
			// 开始XML格式的验证
			return unMarshaller.unmarshal(xml);
		} catch (Exception ex) {
			throw new YssException(ex);
		}
	}
	
	/**
	 * XML结构验证
	 * 
	 * @param Schema
	 *            Schema对象
	 * @param xmlPath
	 *            XML路径
	 * @throws YssException
	 */
	public void unMarshalValidater(Schema schema,InputStream inputStream)
			throws YssException {
		try {
			/** 开始XML格式的验证 **/
			// 通过Schema产生针对于此Schema的验证器,利用xsd文件进行验证
			Validator validator = schema.newValidator();
			// 得到验证的数据源,就是xml文件
			Source source = new StreamSource(inputStream);
			validator.validate(source);
		} catch (org.xml.sax.SAXParseException saxe) {
			throw new YssException("XML结构验证失败,请检查第"
					+ saxe.getLineNumber() + "行XML配置!\n" + saxe.getMessage());
		} catch (Exception ex) {
			throw new YssException(ex.getMessage());
		}
	}
}

 

© 著作权归作者所有

上一篇: Java XML工具类
下一篇: Java 工具函数
oaks
粉丝 0
博文 71
码字总数 68614
作品 0
私信 提问
Java的XML开发包--JAXB

JAXB(Java Architecture for XML Binding简称JAXB)允许Java开发人员将Java类映射为XML表示方式。JAXB提供两种主要特性:将一个Java对象序列化为XML,以及反向操作,将XML解析成Java对象。换...

匿名
2008/09/09
5.7K
0
jaxb替换smooks项目方案建议书

1 前言 本文档是描述Smooks的应用情况,以及使用Jaxb替换smooks的可行性分析及实施方案,有不足之处还望谅解和指出。 2 背景 项目系统中使用Smooks出现几次死锁问题导致系统宕机,其后针对S...

WinnieChan
2013/08/02
1K
1
JAXB 应用指南

文章转自:http://blog.csdn.net/darxin/article/details/4845820 JAXB(Java Architecture for XML Binding)是一种特殊的序列化/反序列化工具。它可以使XML数据以Java Objects的形式直接应...

红薯
2011/08/06
4.8K
0
JaxbContext生成xml文件或java类对象转化注解

JAXB(Java API for XML Binding),提供了一个快速便捷的方式将Java对象与XML进行转换。在JAX-WS(Java的WebService规范之一)中,JDK1.6 自带的版本JAX-WS2.1,其底层支持就是JAXB。 JAXB...

K_ONE
2016/02/16
168
0
JAXB转换XML与DOM解析XML的性能比较

对于XML的解析,可以使用DOM解析,也可以使用JAXB将其转为java对象 二者各有利弊: 1.DOM解析后获取的org.w3c.dom.Document对象,要从中获取相关节点信息操作起来,肯定没有java对象获取某个信息方...

木子丰
2016/08/25
111
0

没有更多内容

加载失败,请刷新页面

加载更多

Android面试常客之Handler全解

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/fnhfire_7030/article/details/79518819 前言:又到了一年...

shzwork
18分钟前
4
0
position sticky 定位

本文转载于:专业的前端网站➫position sticky 定位 1、兼容性 https://caniuse.com/#search=sticky chrome、ios和firefox兼容性良好。 2、使用场景 sticky:粘性。粘性布局。 在屏幕范围内时...

前端老手
25分钟前
3
0
CentOS 7 yum 安装 PHP7.3 教程

参考:https://www.mf8.biz/centos-rhel-install-php7-3/ 1、首先安装 EPEL 源: yum install epel-release 安装 REMI 源: yum install http://rpms.remirepo.net/enterprise/remi-release......

dragon_tech
40分钟前
4
0
Linux物理网卡聚合及桥接

Linux内部实现的bridge可以把一台机器上的多张网卡桥接起来,从而把自己作为一台交换机。同时,LInux bridge还支持虚拟端口,即桥接的不一定都是物理网卡接口,还可以是虚拟接口。目前主要表...

xiangyunyan
40分钟前
4
0
一起来学Java8(一)——函数式编程

在这篇文章中,我们将了解到在Java8下如何进行函数式编程。 函数式编程 所谓的函数式编程就是把函数名字当做值进行传递,然后接收方拿到这个函数名进行调用。 首先来看下JavaScript如何进行函...

猿敲月下码
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部