`
yuancihang
  • 浏览: 145184 次
  • 性别: Icon_minigender_1
  • 来自: 洛阳
社区版块
存档分类
最新评论

使用JDK自带类库操作XML二 JAXB

阅读更多

1. 环境

jdk1.6

2. 代码

public class XmlException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public XmlException(String message){
        super(message);
    }
   
    public XmlException(String message, Throwable cause){
        super(message, cause);
    }
}

 

import org.xml.sax.ErrorHandler;

import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class ForgivingErrorHandler implements ErrorHandler {

    public void error(SAXParseException exception) throws SAXException {
        System.out.println(exception.getMessage());
    }

    public void fatalError(SAXParseException exception) throws SAXException {
        System.out.println(exception.getMessage());
    }

    public void warning(SAXParseException exception) throws SAXException {
        System.out.println(exception.getMessage());
    }

}

 

import java.io.File;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringReader;

import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
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;

public class Jaxb {
   
    public static <T extends Object> T parseFromString(Class<T> clazz, String xmlStr)throws XmlException{
        return parse(clazz, new StringReader(xmlStr));
    }
    public static <T extends Object> T parse(Class<T> clazz, final String xmlFile)throws XmlException{
        return parse(clazz, xmlFile, false);
    }
   
    public static <T extends Object> T parse(Class<T> clazz, final String xmlFile, final boolean isValidate)throws XmlException{
        File f = new File(xmlFile);
        if(!f.exists()){
            return null;
        }
        if(isValidate && !validator(f)){
            throw new XmlException("文件"+xmlFile+"验证失败");
        }
        T obj = null;
        try {
            obj = parse(clazz, new FileReader(f));
        } catch (Exception e) {
            throw new XmlException(e.getMessage(), e);
        }
        return obj;
    }
   
    public static <T extends Object> T parse(Class<T> clazz, InputStream is)throws XmlException{
        return parse(clazz, is, "UTF-8");
    }
    public static <T extends Object> T parse(Class<T> clazz, InputStream is, final String encoding)throws XmlException{
        T obj = null;
        try {
            obj = parse(clazz, new InputStreamReader(is, encoding));
            is.close();
        } catch (Exception e) {
            throw new XmlException(e.getMessage(), e);
        }
        return obj;
    }
    public static <T extends Object> T parse(Class<T> clazz, Reader reader)throws XmlException{
        T obj = null;
        try {
            JAXBContext context = JAXBContext.newInstance(clazz);
            Unmarshaller um = context.createUnmarshaller();
            obj = (T)um.unmarshal(reader);
            reader.close();
        } catch (Exception e) {
            throw new XmlException(e.getMessage(), e);
        }
        return obj;
    }
   
    /**
     * 验证文档是否有效
     * @param f File
     * @return
     */
    public static boolean validator(final File f){
        //加载一个模式工厂
        SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        try {
            //编译源文件中的模式
            Schema schema = schemaFactory.newSchema();
            //用编译后的模式创建一个验证程序
            Validator validator = schema.newValidator();
            validator.setErrorHandler(new ForgivingErrorHandler());
            //为需要验证的文档创建Source对象。StreamSource通常最简单
            Source source = new StreamSource(f);
            //验证输入的源文档。如果文档无效,则抛出SAXException.否则什么也不显示
            validator.validate(source);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
   
    public static void write(Object obj , final String xmlFile)throws XmlException{
        File f = new File(xmlFile);
        try {
            if(!f.exists()){
                f.createNewFile();
            }
            JAXBContext context = JAXBContext.newInstance(obj.getClass());
            Marshaller m = context.createMarshaller();
            m.setProperty(Marshaller.JAXB_ENCODING, "UTF-8"); //指定已编组 XML 数据中的输出编码,默认为UTF-8
            m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); //使用换行和缩排对已编组 XML 数据进行格式化,默认为false
            FileWriter fw = new FileWriter(f);
            m.marshal(obj, fw);
            fw.close();
        } catch (Exception e) {
            throw new XmlException(e.getMessage(), e);
        }
    }

}

 

3. 使用的XSD文件books.xsd

<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSpy v2008 (http://www.altova.com) by yuan (EMBRACE) -->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:element name="ENTER_NAME_OF_ROOT_ELEMENT_HERE">
        <xs:annotation>
            <xs:documentation>Comment describing your root element</xs:documentation>
        </xs:annotation>
    </xs:element>
    <xs:element name="book">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="id" type="xs:string"/>
                <xs:element name="name" type="xs:string"/>
                <xs:element name="price" type="xs:int"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    <xs:element name="books">
        <xs:complexType>
            <xs:sequence>
                <xs:element ref="book" maxOccurs="unbounded"/>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

 

4. 使用的xml文件books.xml

<?xml version="1.0"?>

<books>

<book>

<id>1</id>

<name>test</name>

<price>10</price>

</book>

</books>

 

5. 用法

1>根据schema生成java类

xjc -p test books.xsd

 

Book.java

Books.java

ObjectFactory.java

2>解析

Books books = Jaxb.parse(Books.class, "d:/test/books.xml");

for(Book book : books.getBook()){

      System.out.println(book.getName() + ", " + book.getPrice());

}

 

分享到:
评论

相关推荐

    java核心类库使用大全

    8. **XML处理**:如DOM和SAX解析器,以及JAXB绑定。 9. **JavaMail**:发送和接收电子邮件的API。 10. **Java加密**:提供密码学服务,如加密、解密、数字签名和哈希算法。 通过深入学习这份“java核心类库使用大全...

    jdk-6u45-linux-x64.bin

    6. **XPath和XML处理**:JDK 1.6改进了XML处理,包括JAXB(Java Architecture for XML Binding)和JAXP(Java API for XML Processing),使得XML数据绑定和解析更加方便。 7. **增强的安全性**:1.6版本加强了Java...

    jdk源码包jdk-11.0.1

    1. **java.xml**:这部分源码涉及到Java的XML处理,包括解析、操作和生成XML文档的API,如DOM、SAX和JAXB。它涵盖了Java标准版中的XML支持,使开发者能够使用Java处理XML数据。 2. **jdk.management.agent**:这...

    jdk1.6缺省文件

    【标题】"JDK1.6缺省文件"指的是Java Development Kit 1.6版本的默认组件和库文件,这些文件通常包含在JDK的zip压缩包中,无需经过安装过程即可使用。JDK是Java编程语言的核心工具集,包含了编译器、解释器、调试器...

    jdk6-x64.zip

    - 加强了XML处理,包括SAX和DOM解析器的性能提升,以及JAXB的增强。 - 引入了新的并发工具类,如ConcurrentHashMap和Fork/Join框架,帮助开发者编写更高效的多线程代码。 除此之外,JDK1.6还对垃圾收集机制进行了...

    Java2_类库

    最后,"Java2_类库"还包含了许多其他的模块,如XML处理(DOM、SAX、JAXB)、国际化(I18N)、日志框架(java.util.logging)、定时任务(java.util.Timer)等。这些都极大地丰富了Java的开发环境,提高了开发效率。 ...

    超经典xml类

    例如,JDK自带的`javax.xml.parsers.DocumentBuilderFactory`和`org.w3c.dom.Document`可用于构建和操作DOM树。 2. SAX解析: SAX解析器不将整个文档加载到内存,而是通过事件处理器接口(如`ContentHandler`)...

    JDK_API_1_6.rar

    8. **Java XML处理**:包括SAX、DOM和JAXB等,用于解析、生成和操作XML文档。 三、JDK 1.6的新特性 1. **改进的泛型**:引入了类型推断,使泛型的使用更加简洁。 2. **增强的枚举**:添加了枚举实例的比较、遍历...

    java 开发工具 jdk 1.4 免安装版

    8. **XML支持**:增强了对XML的处理,包括SAX和DOM解析器,以及JAXB(Java Architecture for XML Binding),允许将Java对象和XML文档之间进行映射。 9. **网络编程**:引入了`SocketChannel`和`...

    JDK1.8和JDK1.6API帮助文档

    5. **XML处理**:JAXB(Java Architecture for XML Binding)和StAX(Streaming API for XML)得到增强,使XML处理更加便捷。 6. **NIO.2**:引入了新的文件系统API,提供了异步I/O操作和路径处理,增强了非阻塞I/O...

    JDK_API_1.6.CHM 中文版

    6. **XML处理**:JAXB 2.0提供了更方便的数据绑定,而StAX(Streaming API for XML)则提供了低级别的XML解析能力。 7. **改进的日志和诊断**:JDK 1.6提供了更强大的日志框架和JConsole等诊断工具,帮助开发者监控...

    jdk-6u30-apidocs

    同时,JAXB(Java Architecture for XML Binding)允许开发者将Java对象直接转换为XML,反之亦然,极大地提高了XML处理的效率。 六、国际化 Java的国际化支持在6u30版本中进一步完善,包括日期时间格式化、数字和...

    jdk版本1.6

    8. **XML处理**:JAXB 2.0和StAX API的引入,让XML的序列化和解析更为简单,提高了XML处理的灵活性。 9. **内存分析工具**:JDK 1.6提供了一些内存分析工具,如jmap、jhat等,帮助开发者诊断和解决内存泄漏问题。 ...

    jdk1.8_api中文版本(免积分下载)

    JDK 1.8 API包含多个核心模块,如基础类库、集合框架、I/O流、网络编程、多线程、反射、注解、XML处理等。这些模块为各种功能提供了基础支持: - **基础类库**:包括基本数据类型、异常处理、字符串操作、日期和...

    jdk1.6安装包

    6. XML处理:StAX API的集成使得处理XML文档更加高效,同时DOM4J和JAXB也进行了升级。 7. 安全性加强:JDK 1.6提升了加密算法和安全策略,增加了对数字签名和SSL/TLS协议的支持。 二、JDK 1.6的安装 1. 下载:你...

    jdk6 linux32位 linux64位 windows 64位

    此外,JDK 6还引入了新的API和类库,例如NIO.2(New I/O API),提供了一套基于通道(Channel)和选择器(Selector)的异步I/O操作,这在处理大量并发连接时非常有用。 针对开发者工具,JDK 6中的JConsole提供了...

    jdk6中文api.rar

    8. **JAXB 2.0**:Java Architecture for XML Binding的升级版,简化了XML和Java对象之间的绑定,提高了XML数据的处理效率。 9. **JDBC 4.0**:更新了Java Database Connectivity接口,增加了自动连接管理和新的SQL...

    jdk1.6最稳定版

    4. **改进的XML处理**:Java API for XML Processing (JAXP) 和Java Architecture for XML Binding (JAXB) 在1.6中得到升级,支持更高效的XML解析和转换。 5. **增强的安全性**:JDK 1.6增强了安全管理器,提供了更...

    JDK6.0API官方中文版CHM

    6. **XML处理改进**:JAXB 2.0引入了更强大的XML绑定功能,StAX(Streaming API for XML)提供了一种新的流式处理XML的方式。 7. **Scripting API**:JDK 6.0引入了JSR 223脚本引擎接口,允许在Java中嵌入和执行...

    Jdk6解压打包版本

    `JAXB 2.0`提供了XML到Java对象的自动绑定,简化了Web服务的开发。 5. **JDBC 4.0**:JDBC API在JDK 6中升级到了4.0版本,引入了自动连接管理、结果集的滚动和分页以及批处理更新等功能,提升了数据库访问的效率和...

Global site tag (gtag.js) - Google Analytics