Jaxb 工具类

package zj.simpleframework.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.ValidationEvent;
import javax.xml.bind.ValidationEventHandler;
import javax.xml.bind.ValidationEventLocator;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.xml.sax.SAXException;

/**
 * <p>Title: JAXB 工具类</p>
 * <p>Description: 此工具类使用JAXB将对象转化成xml 或者 将xml文件转化成Object</p>
 * @author zhou_jun
 *
 */
public abstract class JAXBUtil {
	private static final Log log = LogFactory.getLog(JAXBUtil.class);
	private static final String DEFAULT_ENCODING = "UTF-8"; 
	
	/**
	 * 将Javabean 对象转化成 xml 
	 * @param jc (JAXBContext) 
	 * @param element (JAXBElement)
	 * @param xmlPath (String) xml文件路径
	 * @param encoding 转化的编码 , 默认为UTF-8
	 */
	
	public static void objectToXml(JAXBContext jc, JAXBElement<?> element, final String xmlPath, String encoding){
		try {
			Marshaller m = jc.createMarshaller();
			//格式化输出
			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
			//编码
			encoding = encoding == null ? DEFAULT_ENCODING : encoding;
			//打印到控制台
			m.marshal(element, System.out);
			//设置输出的编码格式
			m.setProperty("jaxb.encoding", encoding);
			OutputStream out = new  FileOutputStream(new File(xmlPath));
			m.marshal(element, out);
			out.flush();
			out.close();
		} catch (JAXBException e) {
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 重载方法, 具体实现看: objectToXml(JAXBContext jc, JAXBElement<?> element, final String xmlPath, String encoding)
	 * @param jc (JAXBContext)
	 * @param element (JAXBElement)
	 * @param xmlPath (String)  xml文件路径
	 */
	public static void objectToXml(JAXBContext jc, JAXBElement<?> element, final String xmlPath){
		objectToXml(jc, element, xmlPath,null);
	}
	
	/**
	 * 将传入的xml文件,转化成Object
	 * @param u (Unmarshaller) 
	 * @param xmlPath (String) xml文件路径
	 * @return Object
	 */
	public static Object xmlToObject(Unmarshaller u, final String xmlPath){
		Object obj = null;
		try {
			JAXBElement<?> je = (JAXBElement<?>)u.unmarshal(new FileInputStream(xmlPath));
			 obj = je.getValue();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (JAXBException e) {
			e.printStackTrace();
		}
		return obj;
	}
	
	/**
	 * 验证Schema, 返回一个Unmarshaller对象
	 * @param jc (JAXBContext)
	 * @param xsdPath (schema文件路径)
	 * @return (Unmarshaller)
	 */
	public static Unmarshaller validate(JAXBContext jc, String xsdPath){
		Unmarshaller u = null;
		try {
			u = jc.createUnmarshaller();
			SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
			Schema schema = sf.newSchema(new File(xsdPath));
			u.setSchema(schema);
			u.setEventHandler(
					new ValidationEventHandler(){
						public boolean handleEvent(ValidationEvent ve){
							if(ve.getSeverity() == ValidationEvent.ERROR || ve.getSeverity() != ValidationEvent.WARNING){
								ValidationEventLocator vel = ve.getLocator();
								log.error("Line:Col[" + vel.getLineNumber() + ":" + vel.getColumnNumber() + "]:" + ve.getMessage());
								return false;
							}
							return true;
						}
					}
			);
		} catch (SAXException e) {
			log.error("Unable to validate due to following error.");
			e.printStackTrace();
		} catch (JAXBException e) {
			e.printStackTrace();
		}
		return u;
	}
}

你可能感兴趣的:(apache,xml)