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文件來寫)效率非常高,可以滿足需求。

 

 

發佈了41 篇原創文章 · 獲贊 0 · 訪問量 2567
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章