Java与XML的故事二:XML与Java Object互相转换

XML文件和Java对象转换是一件非常简单的事情,有了annotation的java文件和XML schema XSD文件,可以简单的通过JAXB API来实现XML与Java Object转换

marshaller Java to XML

Exception is not display here

prviate static javax.xml.bind.JAXBContext jaxbCtx = null;
private static Schema schema = null;
static {
jaxbCtx = javax.xml.bind.JAXBContext.newInstance(T.class); //jaxbcontext is thread safe
SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); // factory not thread safe
        Schema schema = sf.newSchema(new File("T.xsd")); //schema is thread safe

}

private static void validate(T t){
        JAXBSource source = new JAXBSource(jaxbCtx, t);
        Validator validator = schema.newValidator();
       // validator.setErrorHandler(new MyValidationErrorHandler());
        validator.validate(source); // SAXException throws if failed, you can define your error handler or just notify the exception to caller
}
public static void marshToFile(T t, File file){
    validate(t);
            javax.xml.bind.Marshaller marshaller = jaxbCtx.createMarshaller(); // not thread safe
            marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_ENCODING, "UTF-8");
            marshaller.setProperty(javax.xml.bind.Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
         //   if(logger.isDebugEnabled){ StringWriter sw = new StringWriter(); marshaller.marshal(t, sw); logger.debug(sw.toString());}
            marshaller.marshal( t, file);
}

unmarshaller XML to Java

public static T unmarshFromXml(File xmlFile){
        Unmarshaller unmarshaller = jaxbCtx.createUnmarshaller();
        unmarshaller.setSchema(schema);
        //unmarshaller.setEventHandler(new MyValidationErrorHandler());
        T test = (T) unmarshaller.unmarshal(xmlFile); //UnmarshalException if failed
        }

ErrorHandler

默认抛出SAXException如果在validation的时候出现问题(fatal error),可以自己定制handler实现出现错误时候系统行为,例如更细节的错误记录。

public class MyValidationErrorHandler implements ErrorHandler {
......
    public void warning(SAXParseException ex) {
        logger.error(ex.getMessage());
    }

    public void error(SAXParseException ex) {
        logger.error(ex.getMessage());
    }

    public void fatalError(SAXParseException ex) throws SAXException {
        throw ex;
    }

}
时间: 2024-10-14 00:21:11

Java与XML的故事二:XML与Java Object互相转换的相关文章

XML学习总结(二)——XML入门

一.XML语法学习 学习XML语法的目的就是编写XML 一个XML文件分为如下几部分内容: 文档声明 元素 属性 注释 CDATA区 .特殊字符 处理指令(processing instruction) 1.1.xml语法——文档声明 在编写XML文档时,需要先使用文档声明,声明XML文档的类型. 最简单的声明语法: <?xml version="1.0" ?> 例如: 1 <?xml version="1.0"?> 2 <softCo

xml基础之二(XML结构【1】)

xml基础之二(XML结构[1]) 新建 模板 小书匠 XML结构 XML结构 1.1 元素:被开始标签和结束标签所包裹的内容,(红色部分),蓝色部分也是元素,由于其仅有词语和句子,可细分为文本元素. 1.2 属性:在开始标签内,用于描述标签附加信息的字段,等于号前面的字段为属性,其后面的字符串为属性值.(青绿色部分) 简化结构如下: xml简化结构 从根节点开始,包含1个或多个子节点,子节点还可以有其他子节点,在这些子节点的开始标签内用属性来定义其功能特性和附加信息,在开始和结束标签内的用文本

深度理解java虚拟机读书笔记(二)HotSpot Java对象创建,内存布局以及访问方式

内存中对象的创建.对象的结构以及访问方式. 一.对象的创建 在语言层面上,对象的创建只不过是一个new关键字而已,那么在虚拟机中又是一个怎样的过程呢? (一)判断类是否加载.虚拟机遇到一条new指令的时候,首先会检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号代表的类是否被加载.解析并初始化.如果没有完成这个过程,则必须执行相应类的加载. (二)在堆上为对象分配空间.对象需要的空间大小在类加载完成后便能确定.之后便是在堆上为该对象分配固定大小的空间.分配的方式也有两种:

Java性能优化指南系列(二):Java 性能分析工具

进行JAVA程序性能分析的时候,我们一般都会使用各种不同的工具.它们大部分都是可视化的,使得我们可以直观地看到应用程序的内部和运行环境到底执行了什么操作,所以性能分析(性能调优)是依赖于工具的.在第2章,我强调了基于数据驱动的性能测试是非常重要的,我们必须测试应用的性能并理解每个指标的含义.性能分析和数据驱动非常类似,为了提升应用程序的性能,我们必须获取应用运行的相关数据.如何获取这些数据并理解它们是本章的主题.[本章重点介绍JDK中提供的性能分析工具] 操作系统工具及其分析 程序分析的起点并不

Java SE之XML&lt;二&gt;XML DOM与SAX解析

[文档整理系列] Java SE之XML<二>XML DOM与SAX解析 XML编程:CRUD(Create Read Update Delete) XML解析的两种常见方式: DOM(Document Object Model): 特点:树状解析 优点:[更适合对XML文档的(crud)操作.]对XML文档增删改查操作很方便灵活 缺点:内存消耗很大,不适合数据量很大,节点很多的XML文档. SAX(Simple API for XML): 特点:自上往下顺序解析 优点:[占用内存小,解析速度

Java与XML的故事一:通过XSD生成Java类

JAXB让Java与XML之间繁琐的机械编码成为过去,现在可以简单的通过XSD文件生成对应的Java文件,我一般使用maven-jaxb2-plugin来实现xsd到java文件的生成. POM配置 指定xsd文件路径,制定binding文件路径,指定生成java文件路径 <plugin> <groupId>org.jvnet.jaxb2.maven2</groupId> <artifactId>maven-jaxb2-plugin</artifact

Java与XML的故事序:Jaxb和Jaxp

当年我刚开始使用Java的时候,有时候会考虑使用xml来存储数据,那个时候一般使用JAXP中的DOM或者SAX parser 包来CRUD xml文件.后来Web Service大行其道,WSDL, XSD这种很好格式化的文档,非常适合可以自动生成代码,于是出现了JAXB,通过annotation方便实现xml和Java class之间的转换. JAXP (Java API for XML Processing) 中DOM( Document Object Model)把整个xml当成对象处理,

Java进阶学习第五天——XML入门

文档版本 开发工具 测试平台 工程名字 日期 作者 备注 V1.0 2016.04.14 lutianfei none onsubmit事件 控制表单提交 需要把onsubmit作用在表单上 <form onsubmit=""> 值的写法:onsubmit="return run()" run()必须要有返回值,必须返回true或者false. 如果返回是true,表单可以提交,如果返回false,表单不能提交.如果没有返回值,默认是表单提交. run(

使用Java并发包线程池和XML实现定时任务动态配置和管理

文章标题:使用并发包线程池和XML实现定时任务动态配置和管理 文章地址: http://blog.csdn.net/5iasp/article/details/32705601 作者: javaboy2012Email:[email protected]qq:    1046011462 项目结构: 一.采用的知识点: 1. java并发包2. xml配置文件读取3. 反射动态调用类的方法 二. 基本思路 1.  创建线程池: ScheduledExecutorService scheduExe