使用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());

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值