schema校验xml大文件

使用dom4j进行校验时是将整个文件读入内存,处理大文件内存溢出。

使用xsd schema,通过stax读取xml大文件解决问题。

 

import java.io.*;

import javax.xml.transform.Source;

import javax.xml.transform.stream.StreamSource;

import javax.xml.validation.*;

import javax.xml.XMLConstants;

import org.xml.sax.SAXParseException;

 

public class XMLValidator {

public static void validate(String sourceFilePath, String schemaFilePath) throws Exception {

// 1. Lookup a factory for the W3C XML Schema language

SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);

 

// 2. Compile the schema.

// Here the schema is loaded from a java.io.File, but you could use

// a java.net.URL or a javax.xml.transform.Source instead.

File schemaLocation = new File(schemaFilePath);

Schema schema = factory.newSchema(schemaLocation);

 

// 3. Get a validator from the schema.

Validator validator = schema.newValidator();

 

// 使用javax.stream 读取源文件

Source source = new StreamSource(sourceFilePath);

try {

validator.validate(source);

} catch (SAXParseException ex) {

System.out.println(ex.getMessage());

//可获取文件、行号、具体原因

}

}

内部实现采用apache xerces

com.sun.org.apache.xerces.internal.impl.xs.XMLSchemaValidator fSchemaValidator;

http://www.ibm.com/developerworks/xml/library/x-javaxmlvalidapi.html

 

之前遇到问题:

在处理镜像大文件时需要按规则分解生成小文件并进行校验,channel+stax有效提高了读取300M以上XML文件并写入的效率。开始在使用dom4j写xml时效率难以忍受,主要原因是在按节点写入时的校验过程影响效率。后来通过file channel+stax方式读取xml,写入文件(不做格式校验,当做txt文件来写)效率非常高,可以满足需求。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值